尚硅谷之MySQL基础

(3)唯一键Unique key,简称UK,

  • 同一个表可以有多个唯一约束。
  • 唯一约束可以是某一个列的值唯一,也可以多个列组合值的唯一。
  • MySQL会给唯一约束的列上默认创建一个唯一索引
  • 删除唯一键只能通过删除唯一索引的方式删除,删除时需要指定唯一索引名,唯一索引名就是唯一约束名一样。如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同,如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。

如何建立唯一性约束?

在某个列后面直接加唯一性约束

单独指定表的唯一性约束

组合列唯一性约束

CREATE TABLE t_course(

cid INT PRIMARY KEY,

cname VARCHAR(100) UNIQUE,

description VARCHAR(200)

);

CREATE TABLE t_stu(

sid INT PRIMARY KEY,

sname VARCHAR(100),

card_id CHAR(18),

CONSTRAINT uk_card_id UNIQUE KEY(card_id)

);

#其中CONSTRAINT uk_cname和KEY可以省略

CREATE TABLE t_stu_course(

id INT PRIMARY KEY,

sid INT,

cid INT,

score DOUBLE(4,1),

CONSTRAINT uk_sid_cid UNIQUE KEY(sid,cid)

);

#其中CONSTRAINT uk_sid_cid和KEY可以省略

建表后增加唯一性约束

alter table表名称 add 【constraint 约束名】 unique 【key】 (字段名);

alter table表名称 add 【constraint 约束名】 unique 【key】 (字段名1,字段名2);

ALTER TABLE t_course ADD CONSTRAINT uk_cname UNIQUE KEY(cname);

#其中CONSTRAINT uk_cname和KEY可以省略

ALTER TABLE t_stu ADD CONSTRAINT uk_card_id UNIQUE KEY(card_id);

#其中CONSTRAINT uk_cname和KEY可以省略

ALTER TABLE t_stu_course ADD CONSTRAINT uk_sid_cid UNIQUE KEY(sid,cid);

#其中CONSTRAINT uk_cname和KEY可以省略

如何删除唯一性约束?

ALTER TABLE 表名称 DROP INDEX 唯一性约束名;

#注意:如果忘记名称,可以通过查看表的约束或索引的方式查看

主键和唯一键的区别:

(1)主键是非空,唯一键允许空

(2)主键一个表只能一个,唯一键可以有多个

(4)外键:Foreign key,简称FK

  • 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
  • 在创建外键约束时,如果不给外键约束名称,默认名不是列名,而是自动产生一个外键名(例如 student_ibfk_1;),也可以指定外键约束名。
  • 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是列名,不是外键的约束名。
  • 删除外键时,关于外键列上的普通索引需要单独删除

注意:

  • 在从表上建立外键,而且主表要先存在。
  • 从表的外键列,在主表中引用的只能是键列(主键,唯一键,外键)。
  • 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样
  • 一个表可以建立多个外键约束
  • 从表的外键值必须"在主表中能找到"或者为空,从而约束了从表的外键列的值的添加和修改。
  • 当主表的记录被从表参照时,主表中被参考记录的删除和更新也会受到限制。
    • (1)默认情况下,主表和从表是严格依赖关系RESTRICT。当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据。
    • (2)但是有一种是级联“修改、删除”:
    • ON DELETE SET NULL(级联置空):当外键设置了SET NULL,当主表的相关记录删除时,从表对应的字段改为NULL。注意从表外键字段得允许为空才行
    • ON DELETE CASCADE(级联删除):当外键设置了CASCADE(级联),当主表的相关记录删除时,从表对应的行都删除了。
    • 对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式
  • 如果要删除表,需要先删除从表,才能删除主表
  • 如何建立外键约束?

    创建外键

    CREATE TABLE t_department(

    did INT PRIMARY KEY,

    dname VARCHAR(100) NOT NULL UNIQUE,

    description VARCHAR(200) NOT NULL

    );

    CREATE TABLE t_employee(

    eid INT PRIMARY KEY,

    ename VARCHAR(100) NOT NULL,

    dept_id INT,

    CONSTRAINT fk_emp_dept_did FOREIGN KEY(dept_id) REFERENCES t_department(did) ON UPDATE CASCADE ON DELETE RESTRICT

    );

    #其中CONSTRAINT fk_emp_dept_did可以省略

    #ON UPDATE CASCADE ON DELETE RESTRICT如果省略表示都是RESTRICT

    一个表可以有多个外键,而且主表和从表可以是一张表

    CREATE TABLE t_emp(

    eid INT PRIMARY KEY,

    ename VARCHAR(100) NOT NULL,

    manager_id INT,

    dept_id INT,

    CONSTRAINT fk_emp_dept_did FOREIGN KEY(dept_id) REFERENCES t_department(did)  ON UPDATE CASCADE ON DELETE RESTRICT,

    CONSTRAINT fk_emp_mid_eid FOREIGN KEY(manager_id) REFERENCES t_emp(eid)  ON UPDATE CASCADE ON DELETE RESTRICT

    );

    #其中CONSTRAINT fk_emp_dept_did可以省略

    #ON UPDATE CASCADE ON DELETE RESTRICT如果省略表示都是RESTRICT

    建表后创建外键

    alter table表名称 add 【constraint 约束名】 foreign key (从表字段名) references 主表名(主表被参照字段名);

    ALTER TABLE t_emp ADD CONSTRAINT fk_emp_dept_did FOREIGN KEY(dept_id) REFERENCES t_department(did)  ON UPDATE CASCADE ON DELETE RESTRICT;

    #其中CONSTRAINT fk_emp_dept_did可以省略

    #ON UPDATE CASCADE ON DELETE RESTRICT如果省略表示都是RESTRICT

    如何删除外键约束?

    ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名;

    ALTER TABLE t_emp DROP FOREIGN KEY fk_emp_dept_did;

    如何删除外键列上的索引?

    ALTER TABLE 表名称 DROP INDEX 外键列索引名;

    ALTER TABLE t_emp DROP INDEX dept_id;