zoukankan      html  css  js  c++  java
  • sql

    一、主键

    1.定义

    主键(primary key) 一列(或一组列)其值能够唯一区分表中的每个行。
    唯一标识表中每行的这个列(或这组列)称为主键。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只设计相关的行。

    2.充当主键的条件

    任何两行都不具有相同的主键值。

    每个行都必须具有一个主键值(主键列不允许NULL值)。

    3.创建、增加、删除主键

    (1)新建表时直接创建主键

    CREATE TABLE table_test(

    id INT NOT NULL,

    name VARCHAR(20) NOT NULL,

    address VARCHAR(20),

    PRIMARY KEY(id)

    );

    (2)新建表时创建复合键(主键字段不能包含NULL)。

    CREATE TABLE table_test(

    user_id INT NOT NULL,

    user_name VARCHAR(20) NOT NULL,

    user_address VARCHAR(20),

    PRIMARY KEY (user_id, user_name)

    );

    (3)为已建好的表创建主键(主键列必须不能为NULL)

    CREATE TABLE table_test(

    id INT NOT NULL,

    name VARCHAR(20) NOT NULL,

    address VARCHAR(20)

    );

    ALTER TABLE table_test ADD PRIMARY KEY (id);

    (4)为已建好的表创建复合键(主键字段不能包含NULL)

    CREATE TABLE table_test(

    user_id INT NOT NULL,

    user_name VARCHAR(20) NOT NULL,

    user_address VARCHAR(20)

    );

    ALTER TABLE table_test ADD CONSTRAINT id PRIMARY KEY (user_id, user_name);

    或 alter table 表名 add constraint 主键名 primary key(字段名1,字段名2……)--

    或 alter table 表名 add constraint 主键名 primary key NONCLUSTERED(字段名1,字段名2……)  添加非聚集索引的主键

    (5)删除主键

    ALTER TABLE table_test DROP PRIMARY KEY ;

    或 alter table 表名 drop constraint 主键名

    4.SQL主键约束与唯一约束的区别

    主键约束不可以为空,唯一约束可为空。但两者不允许出现重复值。

     

    二、外键

    1.定义和场景

    (1)定义
    • 设F是基本关系R的一个或一组属性,但不是关系的键,Ks是基本关系S的主键。如果F与Ks相对应,则称F是R的外键,并称基本关系R为参照关系,基本关系S为被参照关系或目标关系。换而言之,如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键则该属性集是关系模式R的外键,通常在数据库设计中缩写为FK。
    • 在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreign key)。 
    (2)场景
    • 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。
    • 不使用外键:表2的FA字段插了一个值,但是这个值在表1中并没有,这个时候,数据库允许插入,并不会对插入的数据做关系检查。
    • 设置外键:插入表2的FA字段的值必须要求在表1的A字段能找到。 同时,如果你要删除表1的某个A字段记录,必须保证表2中没有引用该字段值的列,否则就没法删除。这就是所谓的保持数据的一致性和完整性。

    2.创建、删除语句

    (1)增加外键(创建表的时候)
    CREATE TABLE my_foreign1(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20) NOT NULL COMMENT '学生姓名',
    c_id INT COMMENT '班级id',
    FOREIGN KEY(c_id) REFERENCES t_class(id)
    )CHARSET utf8;

    (2)增加外键(创建表之后)

    alter table 表名 add [constraint 外键名字] foreign key [外键字段] references 父表(主键字段);

    (3)删除外键

    alter table 表名称 drop constraint 外键名

    3.CASCADE为级联执行、RESTRICT为阻止执行

    (1)阻止执行
    • 从表插入新行,其外键值不是主表的主键值便阻止插入;
    • 从表修改外键值,新值不是主表的主键值便阻止修改;
    • 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
    • 主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
    (2)级联执行
    • 主表删除行,连带从表的相关行一起删。在修改和删除主表的主键时,同时更新或删除副表的外键值。
    • 主表修改主键值,连带从表相关行的外键值一起修改。两种方法提供给用户选择。无论选取哪种方法,从表里都不会有多余行。从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现与主表中的标志一致。
    (3)两种实现方法,通过下面方式选择:
    • 界面:设级联更新、级联删除两个选择方框,选取则级联执行、不选取则阻止执行;
    • 命令:设CASCADE、RESTRICT两个可选项,CASCADE为级联执行、RESTRICT为阻止执行。

    ON UPDATE CASCADE--级联更新,主键发生更新时,外键也会更新
    ON DELETE CASCADE-- 级联删除,主键发生删除时,外键也会删除

    ON UPDATE CASCADE ON DELETE RESTRICT--父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败。

    ON UPDATE CASCADE ON DELETE CASCADE--父表更新时子表也更新,父表删除时子表匹配的项也删除。

  • 相关阅读:
    archlinux .bash_history
    Ubuntu环境下挂载新硬盘
    软碟通 UltraISO U启替代品 Win32DiskImager 无设备 无盘符 无u盘 无优盘 解决方案 之diskpart
    delphi Integer overflow
    MSBuild Tools offline
    delphi synedit免费的拼写检查器dll
    git 自定义命令行
    lua编译
    gcc ar
    Windows Subsystem for Linux (WSL)挂载移动硬盘U盘 卸载 c d 盘
  • 原文地址:https://www.cnblogs.com/aczy/p/10923812.html
Copyright © 2011-2022 走看看