zoukankan      html  css  js  c++  java
  • [SQL Server系] -- 约束

    什么是约束?

    约束(Constraint)是SQL Server中提供的 自动保存数据库完整性 的一种方法,定义了可输入表或表的列中的数据限制条件。

    SQL Server中共有5中约束

    • PRIMARY KEY约束   即主关键字约束
    • FOREIGN KEY约束  即外关键字约束
    • UNIQUE约束  即唯一性约束
    • DEFAULT约束  即默认约束
    • CHECK约束  即检查约束

    1:PRIMARY KEY约束

    在表中常有一列或多列的组合,其值能唯一标识表中的每一行。这样的一列或多列成为表的主键(Primary Key)。一个表只能有一个主键,而且主键约束中的列不能为空值。

     eg:

    下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 PRIMARY KEY 约束:

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

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

    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 PRIMARY KEY (Id_P,LastName)
    )

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

    ALTER TABLE Persons
    ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

    2:FOREIGN KEY约束

    外键(Foreign Key)是用于建立和加强两个表(主表与从表)的一列或多列数据之间的连接的。创建约束的顺序是先定义主表的主键,再对从表定义外键约束。

     eg:

    下面的 SQL 在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN KEY:

    CREATE TABLE Orders
    (
    O_Id int NOT NULL PRIMARY KEY,
    OrderNo int NOT NULL,
    Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
    )

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

    CREATE TABLE Orders
    (
    O_Id int NOT NULL,
    OrderNo int NOT NULL,
    Id_P int,
    PRIMARY KEY (O_Id),
    CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)
    REFERENCES Persons(Id_P)
    )

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

    ALTER TABLE Orders
    ADD CONSTRAINT fk_PerOrders
    FOREIGN KEY (Id_P)
    REFERENCES Persons(Id_P)

    3:UNIQUE约束

    UNIQUE约束用于确保表中的两个数据行在非主键中没有相同的列值。与PRIMARY KEY约束类似,UNIQUE约束也强制唯一性,但UNIQUE约束用于非主键的一列或多列组合,且一个表可以定义多个UNIQUE约束,另外UNIQUE约束可以用于定义多列组合。

     eg:

    下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 UNIQUE 约束:

    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 语法:

    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)
    )

    4:DEFAULT约束

    若在表中某列定义了DEFAULT约束,用户在插入新的数据行时,如果该列没有指定数据,那么系统将默认值赋给该列,当然该默认值也可以是空值(NULL)。

     eg:

    下面的 SQL 在 "Persons" 表创建时为 "City" 列创建 DEFAULT 约束:

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

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

    ALTER TABLE Persons
    ALTER COLUMN City SET DEFAULT 'SANDNES'

    5:CHECK约束

    CHECK约束用于限制输入一列或多列的值的范围,通过逻辑表达式来判断数据的有效性。一个列的输入内容必须满足CHECK约束的条件,否则数据无法正常输入。

    CHECK 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

    eg:

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

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

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

    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')
    )

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

    ALTER TABLE Persons
    ADD CHECK (Id_P>0)

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

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

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

    ALTER TABLE Persons
    DROP CONSTRAINT chk_Person
  • 相关阅读:
    VAE变分自编码器Keras实现
    使用docker快速搭建hive环境
    Spark Streaming高吞吐、高可靠的一些优化
    MySQL在同一个表上,删除查询出来的结果
    谈谈Hadoop MapReduce和Spark MR实现
    Java ThreadLocal的使用
    我能想到的最浪漫的Java网络教程之Socket,三步到位!!!
    Java中的不可变集合,我们换个方式理解!!!
    一个试图了解JVM内存模型的两年经验的初级程序员,透彻!
    异步文件通道Java NIO你需要了解多少,来看看这篇文章
  • 原文地址:https://www.cnblogs.com/TangPro/p/3194423.html
Copyright © 2011-2022 走看看