• SQL 高级教程之约束


    SQL 高级教程之约束 2015/5/8/星期五 9:21:40

    我们将主要探讨以下几种约束:

    • NOT NULL
    • UNIQUE
    • PRIMARY KEY
    • FOREIGN KEY
    • CHECK
    • DEFAULT
    补充知识:
    使用MySQL数据库desc 表名时,我们看到Key那一栏,可能会有4种值,即 ' ','PRI','UNI','MUL'。
    1. 如果Key是空的,那么该列值的可以重复,表示该列没有索引,或者是一个非唯一的复合索引的非前导列;
    2. 如果Key是PRI,那么该列是主键的组成部分;
    3. 如果Key是UNI,那么该列是一个唯一值索引的第一列(前导列),并别不能含有空值(NULL);
    4. 如果Key是MUL,那么该列的值可以重复,该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL。

    如果对于一个列的定义,同时满足上述4种情况的多种,比如一个列既是PRI,又是UNI,那么"desc 表名"的时候,显示的Key值按照优先级来显示 PRI->UNI->MUL。那么此时,显示PRI。
    一个唯一性索引列可以显示为PRI,并且该列不能含有空值,同时该表没有主键。
    一个唯一性索引列可以显示为MUL,如果多列构成了一个唯一性复合索引,因为虽然索引的多列组合是唯一的,比如ID+NAME是唯一的,但是没一个单独的列依然可以有重复的值,只要ID+NAME是唯一的即可。

     

    PRIMARY KEY 约束可以是由多列组合(复合组键)定义的,
    某一列的值可以重复,
    但PRIMARY KEY 约束定义中所有列的组合值必须唯一。
    设置复合主键的原因是当一个列不足以用来表示一条记录的唯一性的时候,就需要设置多个列为复合主键,来标识一条记录的唯一性。

    1、NOT NULL

    SQL NOT NULL 约束

    NOT NULL 约束强制列不接受 NULL 值。

    NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

    下面的 SQL 语句强制 "Id_P" 列和 "LastName" 列不接受 NULL 值:

    CREATE TABLE Persons
    (
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
    )
     

    2、UNIQUE 约束

    SQL UNIQUE 约束

    UNIQUE 约束唯一标识数据库表中的每条记录。

    UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

    PRIMARY KEY 拥有自动定义的 UNIQUE 约束。

    请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

     

    UNIQUE KEY的用途:主要是用来防止数据插入的时候重复的。 

     

    SQL UNIQUE Constraint on CREATE TABLE

    下面的 SQL 在 "SP" 表创建时在 "SID" 列创建 UNIQUE 约束:


    MySQL:

    mysql> CREATE TABLE SP
        -> (
        -> SID int NO NULL,
        -> SNAME varchar(50) NOT NULL,
        -> Pro_add varchar(50),
        -> Pro_time datetime,
        -> UNIQUE (SID)
        -> );

    SQL Server / Oracle / MS Access:

    CREATE TABLE Persons
    (
    Id_P int NOT NULL UNIQUE,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
    )
    

    如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,请使用下面的 SQL 语法:

    MySQL / SQL Server / Oracle / MS Access:

    CREATE TABLE Persons
    (
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
    )
    
    若同时创建。Key 那一列显示为PRI。若分开添加,这第一个添加的为PRI。第二个为UNI。
    
    
    
    

    SQL UNIQUE Constraint on ALTER TABLE

    当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:

    MySQL / SQL Server / Oracle / MS Access:

    ALTER TABLE Persons
    ADD UNIQUE (Id_P)
    

    如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:

    MySQL / SQL Server / Oracle / MS Access:

    ALTER TABLE Persons
    ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
    

    撤销 UNIQUE 约束

    如需撤销 UNIQUE 约束,请使用下面的 SQL:

    MySQL:

    ALTER TABLE Persons
    DROP INDEX uc_PersonID
    

    SQL Server / Oracle / MS Access:

    ALTER TABLE Persons
    DROP CONSTRAINT uc_PersonID
    

    3、SQL PRIMARY KEY 约束

    PRIMARY KEY 约束唯一标识数据库表中的每条记录。

    主键必须包含唯一的值。

    主键列不能包含 NULL 值。

    每个表都应该有一个主键,并且每个表只能有一个主键。

    MySQL:

    mysql> create table SP (SID int not null,SNAME varchar(50),Pro_add varchar(50),Pro_time datetime,primary key (SID));
    或者
    mysql> create table SP (SID int primary key not null,SNAME varchar(50),Pro_add varchar(50),Pro_time datetime); 

    上面标红的 先写后写无所谓。


     
    多列组合主键     复合组键

     
     

    撤销 PRIMARY KEY 约束

    如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:

    MySQL:

    ALTER TABLE Persons
    DROP PRIMARY KEY
    

    SQL Server / Oracle / MS Access:

    ALTER TABLE Persons
    DROP CONSTRAINT pk_PersonID
     

     

    SQL FOREIGN KEY 约束

     
     
    一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY
     
     

    SQL CHECK 约束

    SQL CHECK 约束

    CHECK 约束用于限制列中的值的范围。

    如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

    如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

     

    SQL CHECK Constraint on CREATE TABLE

    下面的 SQL 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。

    My SQL:

    CREATE TABLE Persons
    (
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CHECK (Id_P>0)
    )
    

    SQL Server / Oracle / MS Access:

    CREATE TABLE Persons
    (
    Id_P int NOT NULL CHECK (Id_P>0),  此方法在mysql中也可以使用。
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
    )
    

    如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:

    MySQL / SQL Server / Oracle / MS Access:

    CREATE TABLE Persons
    (
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
    )
    

    SQL CHECK Constraint on ALTER TABLE

    如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束,请使用下面的 SQL:

    MySQL / SQL Server / Oracle / MS Access:

    ALTER TABLE Persons
    ADD CHECK (Id_P>0)
    

    如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:

    MySQL / SQL Server / Oracle / MS Access:

    ALTER TABLE Persons
    ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
    

    撤销 CHECK 约束

    如需撤销 CHECK 约束,请使用下面的 SQL:

    SQL Server / Oracle / MS Access:

    ALTER TABLE Persons
    DROP CONSTRAINT chk_Person
    

    MySQL:

    ALTER TABLE Persons
    DROP CHECK chk_Person

    check约束 是规定表中的某一列必须符合某种条件。比如大于0小于0.或者其他。
    在mysql中。check形同虚设。

     
     
    仍然可以插入。尼玛  mysql 还是不行啊 
     

    SQL DEFAULT 约束

    DEFAULT 约束用于向列中插入默认值。

    如果没有规定其他的值,那么会将默认值添加到所有的新记录。

    mysql> CREATE TABLE Persons (

     Id_P int NOT NULL, 

    LastName varchar(255) NOT NULL, 

    FirstName varchar(255), 

    Address varchar(255), 

    City varchar(255) DEFAULT 'Sandnes' 

    );

    Query OK, 0 rows affected (0.04 sec)

     

    mysql> insert into Persons(Id_P,LastName,FirstName,Address) values(1,'hongtao','sun','beijing');

    Query OK, 1 row affected (0.00 sec)

    插入数据时,没有指定City。结果中已经default 填充进去了。


    插入的时候。必须要声明 属性。

    否则报错。
     

    SQL DEFAULT Constraint on ALTER TABLE

    如果在表已存在的情况下为 "City" 列创建 DEFAULT 约束,请使用下面的 SQL:

    MySQL:

    ALTER TABLE Persons
    ALTER City SET DEFAULT 'SANDNES'
    

    SQL Server / Oracle / MS Access:

    ALTER TABLE Persons
    ALTER COLUMN City SET DEFAULT 'SANDNES'

     

    撤销 DEFAULT 约束

    如需撤销 DEFAULT 约束,请使用下面的 SQL:

    MySQL:

    ALTER TABLE Persons
    ALTER City DROP DEFAULT
    

    SQL Server / Oracle / MS Access:

    ALTER TABLE Persons
    ALTER COLUMN City DROP DEFAULT



  • 相关阅读:
    自动化测试工具Gauge--contexts 与 Tear Down steps
    Redis官网第一次闲逛
    针对 《Linux就该这么学》 之 “第三章---管道符、重定向、环境变量” 摘抄、操练及拓展
    父shell 和 子shell; shell脚本的几种执行方式
    麒麟操作系统操练Linux基操
    HTTP代理
    gcc/g++ 安全编码
    golang 生成rsa秘钥对
    depth of feild
    Emission pass
  • 原文地址:https://www.cnblogs.com/sunhongtao/p/78682859d86aeb080603f03a9b3baa0c.html
Copyright © 2020-2023  润新知