SQL约束
约束用于限制加入表的数据的类型。
可以在创建表时规定约束(通过CREATETABLE语句),或者在表创建之后也可以(通过ALTERTABLE语句)。
我们将主要探讨以下几种约束:
?NOTNULL?UNIQUE?PRIMARYKEY?FOREIGNKEY?CHECK?DEFAULT
SQLNOTNULL约束
NOTNULL约束强制列不接受NULL值。
NOTNULL约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新纪录或者更新记录。
下面的SQL语句强制"Id_P"列和"LastName"列不接受NULL值:
CREATETABLEPersons(Id_Pint
NOTNULL,NOTNULL,
LastNamevarchar(255)
FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))
SQLUNIQUE约束
UNIQUE约束唯一标识数据库表中的每条记录。
UNIQUE和PRIMARYKEY约束均为列或列集合提供了唯一性的保证。
PRIMARYKEY拥有自动定义的UNIQUE约束。
请注意,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARYKEY约束。
SQLUNIQUEConstraintonCREATETABLE
下面的SQL在"Persons"表创建时在"Id_P"列创建UNIQUE约束:
MySQL:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),
UNIQUE(Id_P)
)
SQLServer/Oracle/MSAccess:
CREATETABLEPersons(Id_PintNOTNULL
UNIQUE,
LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))
如果需要命名UNIQUE约束,以及为多个列定义UNIQUE约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),
Cityvarchar(255),
CONSTRAINTuc_PersonIDUNIQUE(Id_P,LastName)
)
SQLUNIQUEConstraintonALTERTABLE
当表已被创建时,如需在"P_Id"列创建UNIQUE约束,请使用下列SQL:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
ADDUNIQUE(P_Id)
如需命名UNIQUE约束,并定义多个列的UNIQUE约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
ADDCONSTRAINTuc_PersonIDUNIQUE(P_Id,LastName)
撤销UNIQUE约束
如需撤销UNIQUE约束,请使用下面的SQL:
MySQL:
ALTERTABLEPersons
DROPINDEXuc_PersonID
SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
DROPCONSTRAINTuc_PersonID
SQLPRIMARYKEY约束
PRIMARYKEY约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含NULL值。
每个表应该都一个主键,并且每个表只能有一个主键。
SQLPRIMARYKEYConstraintonCREATETABLE
下面的SQL在"Persons"表创建时在"Id_P"列创建PRIMARYKEY约束:
MySQL:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),
PRIMARYKEY(Id_P)
)
SQLServer/Oracle/MSAccess:
CREATETABLEPersons(Id_PintNOTNULL
PRIMARYKEY,
LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))
如果需要命名PRIMARYKEY约束,以及为多个列定义PRIMARYKEY约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),
Addressvarchar(255),Cityvarchar(255),
CONSTRAINTuc_PersonIDPRIMARYKEY(Id_P,LastName)
)
SQLPRIMARYKEYConstraintonALTERTABLE
如果在表已存在的情况下为"Id_P"列创建PRIMARYKEY约束,请使用下面的SQL:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
ADDPRIMARYKEY(Id_P)
如果需要命名PRIMARYKEY约束,以及为多个列定义PRIMARYKEY约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
ADDCONSTRAINTpk_PersonIDPRIMARYKEY(Id_P,LastName)
注释:注释:如果您使用ALTERTABLE语句添加主键,必须把主键列声明为不包含NULL值(在表首次创建时)。
撤销PRIMARYKEY约束
如需撤销PRIMARYKEY约束,请使用下面的SQL:
MySQL:
ALTERTABLEPersons
DROPPRIMARYKEY
SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
DROPCONSTRAINTpk_PersonID
SQLFOREIGNKEY约束
一个表中的FOREIGNKEY指向另一个表中的PRIMARYKEY。
让我们通过一个例子来解释外键。请看下面两个表:
"Persons"表:
Id_P
LastName
FirstName
Address
City
1
Adams
John
OxfordStreet
London
2
Bush
George
FifthAvenue
NewYork
3
Carter
Thomas
ChanganStreet
Beijing
"Orders"表:
Id_O
OrderNo
Id_P
1
77895
3
2
44678
3
3
22456
1
4
24562
1
请注意,"Orders"中的"Id_P"列指向"Persons"表中的"Id_P"列。
"Persons"表中的"Id_P"列是"Persons"表中的PRIMARYKEY。
"Orders"表中的"Id_P"列是"Orders"表中的FOREIGNKEY。
FOREIGNKEY约束用于预防破坏表之间连接的动作。
FOREIGNKEY约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
SQLFOREIGNKEYConstraintonCREATETABLE
下面的SQL在"Orders"表创建时为"Id_P"列创建FOREIGNKEY:
MySQL:
CREATETABLEOrders(O_IdintNOTNULL,OrderNointNOTNULL,Id_Pint,
PRIMARYKEY(O_Id),
FOREIGNKEY(Id_P)REFERENCESPersons(Id_P)
)
SQLServer/Oracle/MSAccess:
CREATETABLEOrders(O_IdintNOTNULLPRIMARYKEY,OrderNointNOTNULL,
Id_PintFOREIGNKEYREFERENCESPersons(Id_P)
)
如果需要命名FOREIGNKEY约束,以及为多个列定义FOREIGNKEY约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
CREATETABLEOrders(O_IdintNOTNULL,OrderNointNOTNULL,Id_Pint,PRIMARYKEY(O_Id),
CONSTRAINTfk_PerOrdersFOREIGNKEY(Id_P)REFERENCESPersons(Id_P)
)
SQLFOREIGNKEYConstraintonALTERTABLE
如果在"Orders"表已存在的情况下为"Id_P"列创建FOREIGNKEY约束,请使用下面的SQL:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEOrders
ADDFOREIGNKEY(Id_P)REFERENCESPersons(Id_P)
如果需要命名FOREIGNKEY约束,以及为多个列定义FOREIGNKEY约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEOrders
ADDCONSTRAINTfk_PerOrdersFOREIGNKEY(Id_P)REFERENCESPersons(Id_P)
撤销FOREIGNKEY约束
如需撤销FOREIGNKEY约束,请使用下面的SQL:
MySQL:
ALTERTABLEOrders
DROPFOREIGNKEYfk_PerOrders
SQLServer/Oracle/MSAccess:
ALTERTABLEOrders
DROPCONSTRAINTfk_PerOrders
SQLCHECK约束
CHECK约束用于限制列中的值的范围。
如果对单个列定义CHECK约束,那么该列只允许特定的值。
如果对一个表定义CHECK约束,那么此约束会在特定的列中对值进行限制。
SQLCHECKConstraintonCREATETABLE
下面的SQL在"Persons"表创建时为"Id_P"列创建CHECK约束。CHECK约束规定"Id_P"列必须只包含大于0的整数。
MySQL:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,
FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),
CHECK(Id_P>0)
)
SQLServer/Oracle/MSAccess:
CREATETABLEPersons(Id_PintNOTNULL
CHECK(Id_P>0),
LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))
如果需要命名CHECK约束,以及为多个列定义CHECK约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),
CONSTRAINTchk_PersonCHECK(Id_P>0ANDCity='Sandnes')
)
SQLCHECKConstraintonALTERTABLE
如果在表已存在的情况下为"Id_P"列创建CHECK约束,请使用下面的SQL:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
ADDCHECK(Id_P>0)
如果需要命名CHECK约束,以及为多个列定义CHECK约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
ADDCONSTRAINTchk_PersonCHECK(Id_P>0ANDCity='Sandnes')
撤销CHECK约束
如需撤销CHECK约束,请使用下面的SQL:
SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
DROPCONSTRAINTchk_Person