精华内容
下载资源
问答
  • 【转】mysql创建外键sql语句

    千次阅读 2012-10-18 15:00:00
    · NO ACTION: 在ANSI SQL-92标准中,NO ACTION意味这不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新主要键值的企图不被允许进行(Gruber, 掌握SQL, 2000:181)。 InnoDB拒绝对父表的删除或更新...

    定义数据表

    假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。用来保存整机产品信息的表叫做 pc;用来保存配件供货信息的表叫做 parts。

    在 pc 表中有一个字段,用来描述这款电脑所使用的CPU型号;

    在 parts 表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表。

    很显然,这个厂家生产的电脑,其使用的 cpu 一定是供货信息表(parts)中存在的型号。这时,两个表中就存在一种约束关系(constraint)—— pc 表中的 cpu 型号受到 parts 表中型号的约束。

    首先我们来创建 parts 表:

    CREATE TABLE parts (
    ... 字段定义 ...,
    model VARCHAR(20) NOT NULL,
    ... 字段定义 ...
    );

    接下来是 pc 表:

    CREATE TABLE pc (
    ... 字段定义 ...,
    cpumodel VARCHAR(20) NOT NULL,
    ... 字段定义 ...
    };

    设置索引

    若要设置外键,在参照表 (referencing table,即pc表) 和被参照表 (referenced table,即parts表) 中,相对应的两个字段必须都设置索引 (index)。

    对parts表:

    ALTER TABLE parts ADD INDEX idx_model (model);
    这句话的意思是,为 parts 表增加一个索引,索引建立在 model 字段上,给这个索引起个名字叫idx_model。

    对pc表也类似:

    ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);

    事实上这两个索引可以在创建表的时候就设置。这里只是为了突出其必要性。

    定义外键

    下面为两张表之间建立前面所述的那种“约束”。因为pc的CPU型号必须参照parts表中的相应型号,所以我们将pc表的cpumodel字段设置为“外键”(FOREIGN KEY),即这个键的参照值来自于其他表。

    ALTER TABLE pc ADD CONSTRAINT fk_cpu_model 
    FOREIGN KEY (cpumodel) 
    REFERENCES parts(model);

    第一行是说要为pc表设置外键,给这个外键起一个名字叫做fk_cpu_model;第二行是说将本表的cpumodel字段设置为外键;第三行是说这个外键受到的约束来自于parts表的model字段。

    这样,我们的外键就搞好了!如果我们试着CREATE一台pc,它所使用的 cpu 的型号是 parts 表中不存在的,那么 MySQL 会禁止这台 PC 被 CREATE 出来。

    级联操作

    一切看起来都挺好的,不是吗?

    考虑以下这种情况:

    技术人员发现,一个月之前输入到 parts 表中的某个系列的 cpu (可能有很多款)的型号全都输错了一个字母,现在需要改正。我们希望的是,当 parts 表中那些 Referenced Column 有所变化时,相应表中的 Referencing Column 也能自动更正。

    可以在定义外键的时候,在最后加入这样的关键字:

    ON UPDATE CASCADE; 即在主表更新时,子表(们)产生连锁更新动作,似乎有些人喜欢把这个叫“级联”操作。:)

    如果把这语句完整的写出来,就是:

    ALTER TABLE pc ADD CONSTRAINT fk_cpu_model 
    FOREIGN KEY (cpumodel) 
    REFERENCES parts(model)
    ON UPDATE CASCADE;

    除了 CASCADE 外,还有 RESTRICT(禁止主表变更)、SET NULL(子表相应字段设置为空)等操作。

     

    InnoDB拒绝任何试着在子表创建一个外键值而不匹配在父表中的候选键值的INSERT或UPDATE操作。一个父表有一些匹配的行的子表,InnoDB对任何试图更新或删除该父表中候选键值的UPDATE或DELETE操作有所动作,这个动作取决于用FOREIGN KEY子句的ON UPDATE和ON DETETE子句指定的referential action。当用户试图从一个父表删除或更新一行之时,且在子表中有一个或多个匹配的行,InnoDB根据要采取的动作有五个选择:

    · CASCADE: 从父表删除或更新且自动删除或更新子表中匹配的行。ON DELETE CASCADE和ON UPDATE CASCADE都可用。在两个表之间,你不应定义若干在父表或子表中的同一列采取动作的ON UPDATE CASCADE子句。

    · SET NULL: 从父表删除或更新行,并设置子表中的外键列为NULL。如果外键列没有指定NOT NULL限定词,这就是唯一合法的。ON DELETE SET NULL和ON UPDATE SET NULL子句被支持。

    · NO ACTION: 在ANSI SQL-92标准中,NO ACTION意味这不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新主要键值的企图不被允许进行(Gruber, 掌握SQL, 2000:181)。 InnoDB拒绝对父表的删除或更新操作。

    · RESTRICT: 拒绝对父表的删除或更新操作。NO ACTION和RESTRICT都一样,删除ON DELETE或ON UPDATE子句。(一些数据库系统有延期检查,并且NO ACTION是一个延期检查。在MySQL中,外键约束是被立即检查的,所以NO ACTION和RESTRICT是同样的)。

    · SET DEFAULT: 这个动作被解析程序识别,但InnoDB拒绝包含ON DELETE SET DEFAULT或ON UPDATE SET DEFAULT子句的表定义。

    转载于:https://www.cnblogs.com/lijc1990/archive/2012/10/18/2729515.html

    展开全文
  • 文章目录外键SQL语句的编写1. 外键约束作用2. 对于已经存在的字段添加外键约束3. 在创建数据表时设置外键约束4. 删除外键约束5. 小结 外键SQL语句的编写 学习目标 能够写出删除外键约束的SQL语句 1. 外键约束作用...

    外键SQL语句的编写

    学习目标

    • 能够写出删除外键约束的SQL语句

    1. 外键约束作用

    外键约束:对外键字段的值进行更新和插入时会和引用表中字段的数据进行验证,数据如果不合法则更新和插入会失败,保证数据的有效性

    2. 对于已经存在的字段添加外键约束

    -- 为cls_id字段添加外键约束
    alter table students add foreign key(cls_id) references classes(id);
    

    3. 在创建数据表时设置外键约束

    -- 创建学校表
    create table school(
        id int not null primary key auto_increment, 
        name varchar(10)
    );
    
    -- 创建老师表
    create table teacher(
        id int not null primary key auto_increment, 
        name varchar(10), 
        s_id int not null, 
        foreign key(s_id) references school(id)
    );
    

    4. 删除外键约束

    -- 需要先获取外键约束名称,该名称系统会自动生成,可以通过查看表创建语句来获取名称
    show create table teacher;
    
    -- 获取名称之后就可以根据名称来删除外键约束
    alter table teacher drop foreign key 外键名;
    

    5. 小结

    • 添加外键约束: alter table 从表 add foreign key(外键字段) references 主表(主键字段);
    • 删除外键约束: alter table 表名 drop foreign key 外键名;
    展开全文
  • mysql创建外键语句

    千次阅读 2019-07-08 14:46:00
    alter table t_book add constraint `fk` foreign key (`bookTypeId`) references t_booktype(`id`);或者在创表时直接加上 CREATE TABLE t_book(id int primary key auto_increment,bookName varchar(20),author ...
    alter table t_book add constraint `fk` foreign key (`bookTypeId`) references t_booktype(`id`);
    或者在创表时直接加上

    CREATE TABLE t_book(
    id int primary key auto_increment,
    bookName varchar(20),
    author varchar(10),
    price decimal(6,2),
    bookTypeId int,
    constraint `fk` foreign key (`bookTypeId`) references `t_bookType`(`id`)
    );

    转载于:https://www.cnblogs.com/bupt-liqi/p/11151126.html

    展开全文
  • 外键保证数据的完整性和一致性,被参照的表是主表,外键所在字段的表是子表,依赖于数据库中已存在的表的主键。外键的作用是建立子表与父表的关联关系,...3.外键列和参照列必须创建索引,如果外键列不存在索引,mys...

    外键保证数据的完整性和一致性,被参照的表是主表,外键所在字段的表是子表,依赖于数据库中已存在的表的主键。外键的作用是建立子表与父表的关联关系,是约束父表和子表,

    1.父表和子表存储引擎一样且只能为InnoDB,禁止使用临时表,

    2.外键列和参照列必须具有相似的数据类型,其中数字的长度或是否有符号位必须相同,而字符的长度则可以不同;

    3.外键列和参照列必须创建索引,如果外键列不存在索引,mysql将自动创建索引。

    如果子表中有和父表相关联的记录,对父表操作应该有些限制,

    1)默认是restrict:拒绝对父表的删除或更新操作。

    2)No ACTION:标准sql的关键字,在mysql中与RESTRICT相同。如果想修改父表,应该先删除子表中关联父表的记录。

    3)CASCADE其父表删除或更新且自动删除或更新子表中匹配的行。

    CONSTRAINT `employee_ibfk_1` FOREIGN KEY (`depId`) REFERENCES `department` (`id`) ON DELETE CASCADE

                             FOREIGN KEY(depId) REFERENCES department(id) ON DELETE CASCADE ON UPDATE CASCADE

                    FOREIGN KEY (`depId`) REFERENCES `department` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

    4)SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL.

    FOREIGN KEY(depId) REFERENCES department(id) ON DELETE SET NULL ON UPDATE SET NULL

    创建表时候指定:

    create table if not exists employee(
    id smallint unsigned auto_increment key,
    username varchar(20) not null unique,
    depId TINYINT UNSIGNED,
    CONSTRAINT EMP_FK_DEP FOREIGN KEY(depId) REFERENCES department (id)
    )ENGINE=INNODB;

    删除外键

    alter table employee drop FOREIGN KEY  EMP_FK_DEP

    添加外键  如果父表和子表中数据不完整一致性,可能会添加不成功,先保证一致后再操作会成功。

    alter table employee add EMP_FK_DEP FOREIGN KEY(depId) REFERENCES department(id)

    逻辑外键:

     

    展开全文
  • 数据库中外键SQL语句的编写

    千次阅读 2021-01-16 22:05:54
    数据库中外键SQL语句的编写 1. 外键约束作用 外键约束:对外键字段的值进行更新和插入时会和引用表中字段的数据进行验证,数据如果不合法则更新和插入会失败,保证数据的有效性 2. 对于已经存在的字段添加外键约束...
  • 外键SQL语句的编写

    2021-03-26 13:12:21
    1. 外键约束作用 外键约束:对外键字段的值进行更新和插入时会和引用表中字段的数据进行验证,数据如果不合法则更新和插入会...3. 在创建数据表时设置外键约束 -- 创建学校表 create table school( id int not ..
  • mysql 设置外键关联sql语句

    千次阅读 2013-06-01 10:38:56
    CREATE TABLE IF NOT EXISTS `book_info` (  `id` bigint(20) NOT NULL AUTO_INCREMENT, ...首先定义一个外键 KEY `FK_BOOK_INFO_1` (`coupon_group_id`),然后再用alert语句改变!
  • mysql 创建sql语句 带主键和外键

    万次阅读 2010-08-26 11:01:00
    本文示例使用 Birt ...其中 customers 表的 customernumber 字段作为外键出现在 orders 表中,而 orders 表的 ordernumber 字段做为外键出现在 orderdetails 表中。 <br />create TABLE Customers(custome
  • MySQL 数据库设计之三范式 范式: 对设计数据库提出的一些规范,目前有迹可寻的共有8种范式,一般遵守3范式即可。 第一范式(1NF): 强调的是列的原子性,即列不能够再分成其他几列。 第二范式(2NF): 满足 1...
  • mysql创建外键不起作用

    千次阅读 2017-07-05 14:33:45
    今天在mysql手动创建外键的时候,创建了好几次都失败,语法和方式方法都没问题。然后进去点开选项,居然是MyISAM 然后改为InnoDB,再次创建成功 众所周知MyISAM是不支持事务的,而InnoDB支持事务,MyISAM强调的...
  • mysql添加外键语句

    千次阅读 2020-03-04 09:46:09
    sql语句格式: 1.添加外键约束:altertable从表addconstraint外键(形如:FK_从表_主表)foreignkey(从表外键字段)references主表(主键字段); 如:alter table t_book add constraint `fk` foreign key (`...
  • sql语句创建外键关联

    千次阅读 2021-01-29 10:26:47
    sql语句 : USE school; CREATE TABLE student( id INT(10) NOT NULL PRIMARY KEY, NAME VARCHAR(30) DEFAULT NULL, tid INT(10) DEFAULT NULL, KEY `fktid` (`tid`), CONSTRAINT `fktid` FOREIGN KEY(`tid`) ...
  • MYSQL创建外键约束

    2018-12-13 16:19:32
    CONSTRAINT fk_teacher //给外键起名 FOREIGN KEY (tid) //限制列 REFERENCES teacher(id) //被限制列
  • 执行创建外键语句是: alter table osc_forum_fields add constraint FK_forum_value foreign key (forum) references osc_forums ( id ); 执行错误信息是: [SQL] alter table osc_forum_fields add ...
  • mysql创建外键(Foreign Key)方法

    千次阅读 2015-08-31 14:04:32
    MySQL中,InnoDB引擎类型的表支持了外键约束,MyISAM类型暂时不支持外键。 建立外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;此外,联合...
  • 我的2张表的编码charset和collate不一致,2张表都执行执行SQL语句: alter table 表名 convert to character set utf8; 完美解决问题; ps:下面看下MySQL无法创建外键、查询外键的属性 MyISAM 和InnoDB 讲解  ...
  • 最近在玩数据库的时候,偶尔会有外键创建不成功的时候,于是上网查阅资料,整合自己的理解有了以下这篇文章:mysql创建外键不成功的原因以及处理方法:第一种:外键的字段与关联的字段的类型不匹配(包括编码格式的...
  • mysql 外键sql语言编写

    千次阅读 2019-05-22 21:31:27
    创建一个班级表 create table c_class(id int(5) primary key auto_increment,name varchar(10)); 创建好后向里面添加数据 ...再创建一个学生表 将学生表的外键加到班级表的主键中 create table t...
  • SQL的主键和外键的概念: 主键(primary key) 能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的...
  • 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,...
  • mysql 无法创建外键约束

    千次阅读 2012-09-10 11:08:57
    mysql数据库不太熟悉,今天遇到了外键创建问题。alter外键创建语句命令行下提示成功了,但就是没看到外键。 后来改用workbench工具来创建,发现是因为数据默认是采用的MyISAM存储引擎,该引擎不支持外键,需要...
  • 关联2张表时出现了无法创建外键的情况,从这个博客看到,问题出在第六点的Charset和Collate选项在表级和...我的2张表的编码charset和collate不一致,2张表都执行执行SQL语句:alter table 表名 convert to character
  • · NO ACTION: 在ANSI SQL-92标准中,NO ACTION意味这不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新主要键值的企图不被允许进行(Gruber, 掌握SQL, 2000:181)。 InnoDB拒绝对父表的删除或更新...
  • 2007年6月28日MySql错误:ERROR 1005: Cant create table 2007-06-28 21:35:49 一,sql脚本(红色为修改后正确的语句)drop table if exists products;create table products( id int not null auto_increment, ...
  • MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包括...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,231
精华内容 27,292
关键字:

mysql创建外键的sql语句

mysql 订阅