【SQL】數據庫中的五種約束


#五大約束

  1、主鍵約束(Primay Key Coustraint) 唯一性,非空性
  2、唯一約束 (Unique Counstraint)唯一性,可以空,但只能有一個
  3、檢查約束 (Check Counstraint)對該列數據的范圍、格式的限制(如:年齡、性別等)
  4、默認約束 (Default Counstraint)該數據的默認值
  5、外鍵約束 (Foreign Key Counstraint)需要建立兩表間的關系並引用主表的列

 

#五大約束的語法示例

1、添加主鍵約束(將UserId作為主鍵)

  alter table UserId
  add constraint PK_UserId primary key (UserId)

2、添加唯一約束(身份證號唯一,因為每個人的都不一樣)

  alter table UserInfo
  add constraint UQ_IDNumber unique(IdentityCardNumber)

 3、添加默認約束(如果地址不填 默認為“地址不詳”)

  alter table UserInfo
  add constraint DF_UserAddress default (‘地址不詳’) for UserAddress

4、添加檢查約束 (對年齡加以限定 20-40歲之間)

  alter table UserInfo
  add constraint CK_UserAge check (UserAge between 20 and 40)
  alter table UserInfo
  add constraint CK_UserSex check (UserSex=’男’ or UserSex=’女′)

5、添加外鍵約束 (主表UserInfo和從表UserOrder建立關系,關聯字段UserId)

  alter table UserOrder
  add constraint FK_UserId_UserId foreign key(UserId)references UserInfo(UserId)

#SQL Server中五大約束詳解

   約束(Constraint)是Microsoft SQL Server 提供的自動保持數據庫完整性的一種方法,定義了可輸入表或表的單個列中的數據的限制條件。在SQL Server 中有5 種約束:主關鍵字約束(Primary Key Constraint)、外關鍵字約束(Foreign Key Constraint)、惟一性約束(Unique Constraint)、檢查約束(Check Constraint)和缺省約束(Default Constraint)。

1、主關鍵字約束

  主關鍵字約束指定表的一列或幾列的組合的值在表中具有惟一性,即能惟一地指定一行記錄。每個表中只能有一列被指定為主關鍵字,且IMAGE 和TEXT 類型的列不能被指定為主關鍵字,也不允許指定主關鍵字列有NULL 屬性。

此處應有說明:多列組成的主鍵叫聯合主鍵,而且聯合主鍵約束只能設定為表級約束;單列組成的主鍵,既可設定為列級約束,也可以設定為表級約束。

  表級約束與列級約束:點我!

  聯合主鍵

  聯合主鍵就是用2個或2個以上的字段組成主鍵。用這個主鍵包含的字段作為主鍵,這個組合在數據表中是唯一,且加了主鍵索引。
  可以這么理解,比如,你的訂單表里有很多字段,一般情況只要有個訂單號bill_no做主鍵就可以了,但是,現在要求可能會有補充訂單,使用相同的訂單號,那么這時單獨使用訂單號就不可以了,因為會有重復。那么你可以再使用個訂單序列號bill_seq來作為區別。把bill_no和bill_seq設成聯合主鍵。即使bill_no相同,bill_seq不同也是可以的。

  #定義主關鍵字約束的語法如下:

CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])

  #各參數說明如下:
    constraint_name
    指定約束的名稱約束的名稱。在數據庫中應是惟一的。如果不指定,則系統會自動生成一個約束名。
    CLUSTERED | NONCLUSTERED
    指定索引類別,CLUSTERED 為缺省值。
    column_name
    指定組成主關鍵字的列名。主關鍵字最多由16 個列組成。

  #例子:

1 CREATE TABLE [dbo].[UserInfo](
2     [UserId] [int] NOT NULL,
3     [UserName] [nvarchar](50) NOT NULL,
4     CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED 
5     (
6         [UserId] ASC,
7         [UserName] ASC
8     )
9 ) ON [PRIMARY]

2、外關鍵字約束

   外關鍵字約束定義了表之間的關系。當一個表中的一個列或多個列的組合和其它表中的主關鍵字定義相同時,就可以將這些列或列的組合定義為外關鍵字,並設定它適合哪個表中哪些列相關聯。這樣,當在定義主關鍵字約束的表中更新列值,時其它表中有與之相關聯的外關鍵字約束的表中的外關鍵字列也將被相應地做相同的更新。外關鍵字約束的作用還體現在,當向含有外關鍵字的表插入數據時,如果與之相關聯的表的列中無與插入的外關鍵字列值相同的值時,系統會拒絕插入數據。與主關鍵字相同,不能使用一個定義為 TEXT 或IMAGE 數據類型的列創建外關鍵字。外關鍵字最多由16 個列組成。

   #定義外關鍵字約束的語法如下:

CONSTRAINT constraint_name
FOREIGN KEY (column_name1[, column_name2,…,column_name16]REFERENCES ref_table [ (ref_column1[,ref_column2,…, ref_column16] )]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ] ]
[ NOT FOR REPLICATION ]

   #各參數說明如下:

    REFERENCES
    指定要建立關聯的表的信息。
    ref_table
    指定要建立關聯的表的名稱。
    ref_column
    指定要建立關聯的表中的相關列的名稱。

    ON DELETE {CASCADE | NO ACTION}
      指定在刪除表中數據時,對關聯表所做的相關操作。在子表中有數據行與父表中的對應數據行相關聯的情況下,如果指定了值CASCADE,則在刪除父表數據行時會將子表中對應的數據行刪除;如果指定的是NO ACTION,則SQL Server 會產生一個錯誤,並將父表中的刪除操作回滾。NO ACTION 是缺省值。

    ON UPDATE {CASCADE | NO ACTION}
      指定在更新表中數據時,對關聯表所做的相關操作。在子表中有數據行與父表中的對應數據行相關聯的情況下,如果指定了值CASCADE,則在更新父表數據行時會將子表中對應的數據行更新;如果指定的是NO ACTION,則SQL Server 會產生一個錯誤,並將父表中的更新操作回滾。NO ACTION 是缺省值。

    NOT FOR REPLICATION
      指定列的外關鍵字約束在把從其它表中復制的數據插入到表中時不發生作用。

   #例子:

1 CREATE TABLE [dbo].[UserOrder](
2     [OrderId] [int] NOT NULL,
3     [UserId] [int] NOT NULL,
4     [UserName] [nvarchar](50) NOT NULL,
5     CONSTRAINT fk_userid_username FOREIGN KEY([UserId],[UserName]) REFERENCES UserInfo(UserId,UserName) ON DELETE CASCADE,
6 ) ON [PRIMARY]

 3、惟一性約束

  惟一性約束指定一個或多個列的組合的值具有惟一性,以防止在列中輸入重復的值。惟一性約束指定的列可以有NULL 屬性。由於主關鍵字值是具有惟一性的,因此主關鍵字列不能再設定惟一性約束。惟一性約束最多由16 個列組成

  #定義惟一性約束的語法如下:

CONSTRAINT constraint_name
UNIQUE [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])

   #l例子:

1 create table employees (
2     emp_id char(8),
3     emp_name char(10) ,
4     emp_cardid char(18),
5     constraint pk_emp_id primary key (emp_id),
6     constraint uk_emp_cardid unique (emp_cardid)
7 ) on [primary]

 4、檢查約束

  檢查約束對輸入列或整個表中的值設置檢查條件,以限制輸入值,保證數據庫的數據完整性。可以對每個列設置復合檢查。

  #定義檢查約束的語法如下:

CONSTRAINT constraint_name
CHECK [NOT FOR REPLICATION]
(logical_expression)

  #各參數說明如下:
    NOT FOR REPLICATION
      指定檢查約束在把從其它表中復制的數據插入到表中時不發生作用。
    logical_expression
      指定邏輯條件表達式返回值為TRUE 或FALSE。

  #例子:

1 create table orders(
2     order_id char(8),
3     p_id char(8),
4     p_name char(10) ,
5     quantity smallint,
6     constraint pk_order_id primary key (order_id),
7     constraint chk_quantity check (quantity>=10) ,
8 ) on [primary]

   注意:對計算列不能作除檢查約束外的任何約束。

 5、缺省約束

  缺省約束通過定義列的缺省值或使用數據庫的缺省值對象綁定表的列,來指定列的缺省值。SQL Server 推薦使用缺省約束,而不使用定義缺省值的方式來指定列的缺省值。

   #定義缺省約束的語法如下:

CONSTRAINT constraint_name
DEFAULT constant_expression [FOR column_name]

  #例子:

1 CREATE TABLE [dbo].[Students](
2     [Id] [int] NOT NULL,
3     [Name] [nchar](10) NULL,
4     [Age] [int]
5 ) ON [PRIMARY]
6 
7 GO
8 ALTER TABLE [dbo].[Students] ADD  DEFAULT ('未知') FOR [Name]
9 GO
1 alter table [dbo].[Students] add Sex char(2) default ''
2 
3 alter table [dbo].[Students] add constraint DF_age_Students default(20) for age 

6、列約束和表約束

   對於數據庫來說,約束又分為列約束(Column Constraint)和表約束(Table Constraint)。
列約束作為列定義的一部分只作用於此列本身。表約束作為表定義的一部分,可以作用於
多個列。

 

   由上圖可知,1,主鍵、外鍵、唯一、檢查這四項,既可以創建列約束,也可以創建表約束。而缺省 和 非空只能創建列約束

   例子:

1 create table productsss (
2     p_id char(8) ,
3     p_name char(10) ,
4     price money default 0.01 ,
5     quantity smallint check (quantity>=10) , /* 列約束 */
6     constraint pk_p_id_name primary key (p_id, p_name) /* 表約束 */
7 )

 7、關於約束的其他操作

  #刪除約束

ALTER TABLE employees DROP CONSTRAINT emp_manager_fk;

  #關閉約束

ALTER TABLE employees DISABLE CONSTRAINT emp_emp_id_pk CASCADE;   //如果沒有被引用則不需CASCADE關鍵字

 

  #打開約束

ALTER TABLE employees 
ENABLE CONSTRAINT emp_emp_id_pk; //注意,打開一個先前關閉的被引用的主鍵約束,並不能自動打開相關的外部鍵約束

 

注:

  1. 添加主鍵約束會自動創建唯一索引。如果表中尚未創建 聚焦索引,則自動創建聚焦唯一索引。如果表中已存在聚焦索引,則自動創建非聚焦索引。

  2. 添加唯一約束會自動創建唯一索引。如果未在unique關鍵字后加上[nonclustered|clustered],則默認會創建非聚焦索引。

 

參考:

  https://blog.csdn.net/shuohuameijiang/article/details/7275716

  https://www.cnblogs.com/cyxdn/p/8509082.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM