zoukankan      html  css  js  c++  java
  • mysql数据库操作外键、数据库及表编码格式

     1 MySQL中利用外键实现级联删除、更新
     2 
     3 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包括RESTRICT、NO ACTION、SET NULL和CASCADE。其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新;CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录;SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被SET NULL。
     4 
     5 注意: 
     6 1、存储引擎必须使用InnoDB引擎; 
     7 2、外键必须建立索引; 
     8 3、外键绑定关系这里使用了“ ON DELETE CASCADE ” “ON UPDATE CASCADE”,意思是如果外键对应数据被删除或者更新时,将关联数据完全删除或者相应地更新。更多信息请参考MySQL手册中关于InnoDB的文档; 
     9 
    10 
    11 建表时创建外键:
    12 CREATE TABLE`xh` (
    13  `id` int(100) unsigned NOT NULL AUTO_INCREMENT COMMENT ,
    14  `cl_id` smallint(3) unsigned NOT NULL COMMENT,
    15  `title` varchar(100) COLLATE utf8_unicode_ci NOT NULL COMMENT ,
    16  `details` text COLLATE utf8_unicode_ci NOT NULL COMMENT ,
    17  `date` datetime NOT NULL COMMENT ,
    18  `au_id` smallint(6) unsigned NOT NULL COMMENT ,
    19  `click` int(100) unsigned NOT NULL DEFAULT '0' COMMENT ,
    20  `reco` int(100) unsigned NOT NULL DEFAULT '0' COMMENT,
    21  PRIMARY KEY (`id`),
    22  KEY `fk_class` (`cl_id`),
    23  CONSTRAINT `fk_class`FOREIGN KEY  (`cl_id`)  REFERENCES  `fl` (`id`),
    24  KEY `fk_author` (`au_id`),
    25  CONSTRAINT `fk_author` FOREIGN KEY (`au_id`) REFERENCES `author` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    26 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 
      1 依赖模块:
      2 
      3 mysql:https://github.com/felixge/node-mysql npm install mysql --save
      4 async:https://github.com/caolan/async npm install async --save (ps: async模块可换成其它Promise模块如bluebird、q等) 因为Node.js的mysql模块本身对于事务的封装过于简单,而且直接使用会有很严重callback hell,故我们封装了两个方法,一个用来初始化sql & params,一个用来执行事务。
      5 
      6 初始化sql & params  7 function _getNewSqlParamEntity(sql, params, callback) {
      8     if (callback) {
      9         return callback(null, {
     10             sql: sql,
     11             params: params
     12         });
     13     }
     14     return {
     15         sql: sql,
     16         params: params
     17     };
     18 }
     19 
     20 如果你要执行多条sql语句,则需要:
     21 var sqlParamsEntity = [];
     22 var sql1 = "insert table set a=?, b=? where 1=1";
     23 var param1 = {a:1, b:2};
     24 sqlParamsEntity.push(_getNewSqlParamEntity(sql1, param1));
     25 
     26 var sql2 = "update ...";
     27 sqlParamsEntity.push(_getNewSqlParamEntity(sql1, []));
     28 
     29 //...更多要事务执行的sql
     30 
     31 
     32 然后我在我自己的dbHelper.js里封装了execTrans的函数,用来执行事务:
     33 var mysql = require('mysql');
     34 var async = require("async");
     35 
     36 module.exports = {
     37     execTrans: execTrans,
     38 }
     39 
     40 var pool = mysql.createPool({
     41     host: "mysql host",
     42     user: "mysql login user",
     43     password: "mysql login pwd",
     44     database: "target db name",
     45     connectionLimit: 10,
     46     port: "mysql db port",
     47     waitForConnections: false
     48 });
     49 
     50 function execTrans(sqlparamsEntities, callback) {
     51     pool.getConnection(function (err, connection) {
     52         if (err) {
     53             return callback(err, null);
     54         }
     55         connection.beginTransaction(function (err) {
     56             if (err) {
     57                 return callback(err, null);
     58             }
     59             console.log("开始执行transaction,共执行" + sqlparamsEntities.length + "条数据");
     60             var funcAry = [];
     61             sqlparamsEntities.forEach(function (sql_param) {
     62                 var temp = function (cb) {
     63                     var sql = sql_param.sql;
     64                     var param = sql_param.params;
     65                     connection.query(sql, param, function (tErr, rows, fields) {
     66                         if (tErr) {
     67                             connection.rollback(function () {
     68                                 console.log("事务失败," + sql_param + ",ERROR:" + tErr);
     69                                 throw tErr;
     70                             });
     71                         } else {
     72                             return cb(null, 'ok');
     73                         }
     74                     })
     75                 };
     76                 funcAry.push(temp);
     77             });
     78 
     79             async.series(funcAry, function (err, result) {
     80                 console.log("transaction error: " + err);
     81                 if (err) {
     82                     connection.rollback(function (err) {
     83                         console.log("transaction error: " + err);
     84                         connection.release();
     85                         return callback(err, null);
     86                     });
     87                 } else {
     88                     connection.commit(function (err, info) {
     89                         console.log("transaction info: " + JSON.stringify(info));
     90                         if (err) {
     91                             console.log("执行事务失败," + err);
     92                             connection.rollback(function (err) {
     93                                 console.log("transaction error: " + err);
     94                                 connection.release();
     95                                 return callback(err, null);
     96                             });
     97                         } else {
     98                             connection.release();
     99                             return callback(null, info);
    100                         }
    101                     })
    102                 }
    103             })
    104         });
    105     });
    106 }
    107 
    108 这样就可以执行事务了:
    109 execTrans(sqlParamsEntity, function(err, info){
    110 if(err){
    111    console.error("事务执行失败");
    112 }else{
    113    console.log("done.");
    114 }
    115 })
    node mysql模块处理事务回滚
     1 1.查看数据库编码格式
     2 
     3 1
     4 mysql> show variables like 'character_set_database';
     5  2.查看数据表的编码格式
     6 
     7 1
     8 mysql> show create table <表名>;
     9  3.创建数据库时指定数据库的字符集
    10 
    11 mysql>create database <数据库名> character set utf8;
    12 4.创建数据表时指定数据表的编码格式
    13 
    14 create table tb_books (
    15     name varchar(45) not null,
    16     price double not null,
    17     bookCount int not null,
    18     author varchar(45) not null ) default charset = utf8;
    19 5.修改数据库的编码格式
    20 
    21 mysql>alter database <数据库名> character set utf8;
    22 6.修改数据表格编码格式
    23 
    24 mysql>alter table <表名> character set utf8;
    25 7.修改字段编码格式
    26 
    27 mysql>alter table <表名> change <字段名> <字段名> <类型> character set utf8;
    28 
    29 mysql>alter table user change username username varchar(20) character set utf8 not null;
    30  8.添加外键
    31 
    32 mysql>alter table tb_product add constraint fk_1 foreign key(factoryid) references tb_factory(factoryid);
    33 mysql>alter table <表名> add constraint <外键名> foreign key<字段名> REFERENCES <外表表名><字段名>;
    34 9.删除外键
    35 
    36 mysql>alter table tb_people drop foreign key fk_1;
    37 mysql>alter table <表名> drop foreign key <外键名>;
    数据库及表编码格式
  • 相关阅读:
    4.关于QT中的QFile文件操作,QBuffer,Label上加入QPixmap,QByteArray和QString之间的差别,QTextStream和QDataStream的差别,QT内存映射(
    PlSql加入数据库链接
    UserScan的处理流程分析
    第八十八题(金山笔试题,字符串移动)
    4Sum_leetCode
    LeetCode Add Binary
    Hibernate or JPA Annotation中BLOB、CLOB注解写法
    配置Nginx防止直接用IP訪问Webserver
    Java集合系列之TreeMap源代码分析
    使用Application Loader上传APP流程解读[APP公布]
  • 原文地址:https://www.cnblogs.com/burtyang/p/8417285.html
Copyright © 2011-2022 走看看