数据库约束分为两种:表级约束和列级约束
表级约束 应用于表,对表中的多个列起作用,
如primary key,foreign key,unique,check。列级约束 应用于表中的一列,只对该列起作用
,如not null
对于表级约束,写法一般有两种(创建表时),而列级约束一般只有一种
如:
表级check:
只作用于一个列:
CREATE TABLE Persons
(
Id_P number NULL CHECK (Id_P>0),
LastName varchar2(255) NULL,
FirstName varchar2(255),
Address varchar2(255)
)
作用于多个列:
CREATE TABLE Persons
(
Id_P number NULL,
Age number NULL,
LastName varchar2(255) NULL,
FirstName varchar2(255),
Address varchar2(255),
constraint check_name check(Id_P>0 and Age > 0)
)
而列级not null,就只能紧随列定义后加上
CREATE TABLE Persons
(
Id_P number NOT NULL,
Age number NOT NULL,
LastName varchar2(255) NOT NULL,
FirstName varchar2(255) NOT NULL,
Address varchar2(255)
)
有了基于以上的共识后,我们就可以针对每一个约束展开来说了:
1)primary key 主键
PRIMARY KEY约束是指主键约束,用于惟一标识一行记录。在一个表
中只能定义一个
PRIMARY KEY约束,该约束可以定义在单独的列上,也可
以定义在多个列上(表级约束),如
primary key(id)作用于单列,primary key(cert_type,cert_no,client_no)作用于列组。定义
了PRIMARY KEY约束的列或列组合
不能有重复值,也不能有NULL值。
添加主键:
(注:[] 括号内的东西表示可选的,这里如果选,就是命名约束,如果不选,数据库会帮我们命名
一个名字,下同)
在创建表时,为列添加PRIMARY KEY约束,形式如下:
CREATE TABLE table_name (
column_name data_type [ CONSTRAINT constraint_name ]
PRIMARY KEY)
或
CREATE TABLE table_name (
column_name data_type ,
[ CONSTRAINT constraint_name ] PRIMARY KEY (column_name)
)
如果表之前已经创建好的情况:
ALTER TABLE table_name ADD [ CONSTRAINT constraint_name ]
PRIMARY KEY
(column_name);
这里说明一下,对于是表级约束的,修改一般都是 alter ... add这种格式,
而对于列级约束,修改一般是alter ... modify,大家在往下看的时候,可以留个心眼看看是不是
这种情况。
删除primary key约束:
删除列上的PRIMARY KEY约束,需要使用ALTER TABLE … DROP语
句,不过形式上只能采
取指定约束名的方式,如下:
ALTER TABLE table_name DROP CONSTRAIN
constraint_name;
如果在添加约束时使用CONSTRAINT子句为其指定了约束名,那么这里
就可以直接使用该名称。而如果没有使用CONSTRAINT子句,则约束名由
Oracle自动创建,此时就可
以通过连接数据字典user_cons_columns和
user_constraints来查看约束名称。
这里也注意下,表级约束的删除一般是 alter ... drop
而列级约束一般是alter ... modify 就可以胜任了。
foreign key:
FOREIGN KEY约束是指外键约束,用于引用本表或另一个表中的一列
或一组列。引用列与被引用列
可以在同一个表中,这种情况称为“自引用”。
被引用的列或列组应该具有主键约束或惟一约束。
引用列的取值只能为被引用列的值或NULL值。
可以为一个列或一组列定义FOREIGN KEY约束。
如果
引用列中存储了被引用列的某个值,则不能直接删除被引用列中的这个值,否则会与第二条相矛盾
。如果一定要删除,需要先删除引用列中的这个值,然后再删除被引用列中的这个值。(对于理解
外键,这段话挺重要的)
添加FOREIGN KEY约束
在创建表时,为列添加FOREIGN KEY约束,形式如下:CREATE TABLE table_name (
column_name1 data_type [ CONSTRAINT constraint_name ]
REFERENCES table_name2
(column_name2))
或
CREATE TABLE table_name (column_name data_type ,
[ CONSTRAINT constraint_name ] FOREIGN KEY (column_name1,column_name2)
REFERENCES
table_name2 (column_name3,column_name4))
其中,REFERENCES关键字用于定义column_name1列指向其他表
(或本表)中的column_name2列。
也可以为已创建的表中的列添加FOREIGN KEY约束,如下:
ALTER TABLE table_name1 ADD [ CONSTRAINT constraint_name ]
FOREIGN KEY
(column_name1) REFERENCES table_name2
(column_name2);
注意:这里是alter ... add 哦,表级约束就是这样的啦。
check约束,表级约束
CHECK约束是指检查性约束,使用CHECK约束时,将对输入的每一个
数据进行检查,只有符合条件的
记录才会保存到表中,从而保证数据的有
效性和完整性。
CHECK约束具有以下4个特点:
在CHECK约束的表达式中,必须引用表中的一个或者多个列;
并且表达式的运算结果是一个布尔值。
在一个列中,可以定义多个CHECK约束。
对于同一列,可以同时定义CHECK约束和NOT NULL约束。
CHECK约束既可以定义在列级别中,也可以定义在表级别中。
创建表时,为表定义CHECK约束,需要使用CHECK(约束条件)语句。
例如,创建表STUDENT3,为
STUDENTAGE列指定CHECK约束,如下:
SQL>
create table student3(
studentid number(4) not null primary key,
studentcode varchar2(10) unique,studentname varchar2(20),
studentage number(3) constraint stu3_ck check(studentage > 0),tudentaddress
varchar2(40)
);表已创建。
创建表时,列级别
mysql
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
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)
)
创建表时,表级别,命名约束MySQL / SQL Server / OracleCREATE 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')
)
创建表后
MySQL / SQL Server / OracleALTER TABLE Persons
ADD CHECK (Id_P>0)
删除约束
SQL Server / Oracle
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
ALTER TABLE Persons
DROP CHECK chk_Person
UNIQUE约束
UNIQUE约束是指惟一约束,用于要求列中不允许出现重复值。可以为
单独的列添加一个UNIQUE约束
,也可以为多个列添加一个UNIQUE约束
(属于表级约束)。如果为多个列添加一个UNIQUE约束,只
需要保证这多
个列的值不全部相同即可。
添加UNIQUE约束
CREATE TABLE table_name (column_name data_type [ CONSTRAINT constraint_name ]
UNIQUE)
或
CREATE TABLE table_name (
column_name data_type [ CONSTRAINT constraint_name ] UNIQUE (column_name)
也可以为已创建的表中的列添加UNIQUE约束,这时就需要使用ALTER
TABLE … ADD语句,形式如下
ALTER TABLE table_name
ADD [ CONSTRAINT constraint_name ] UNIQUE(column_name);
也是alter ... add 哦,表级的嘛,注意就好。
删除UNIQUE约束
删除列上的UNIQUE约束,可以使用ALTER TABLE … DROP语句,形
式如下:
ALTER TABLE table_name DROP UNIQUE (column_name);
如果约束有名称,也可以使用指定名称的方式删除该约束,语句形式为
如下:
ALTER TABLE table DROP CONSTRAINT constraint_name;
下面就说列级的咯
NOT NULL约束
NOT NULL约束是指非空约束,用于要求向表中添加记录时必须为被约
束的列提供数据,否则将出现
错误。NOT NULL约束只能在列级别上定
义,一个表中可以定义多个NOT NULL约束。
添加NOT NULL约束
在创建表时,为列添加NOT NULL约束,形式如下:
column_name data_type
[ CONSTRAINT constraint_name ] NOT NULL
其中,CONSTRAINT constraint_name表示为约束指定名称。
也可以为已创建的表中的列添加NOT NULL约束,这时就需要使用
ALTER TABLE … MODIFY语句,形
式如下:
ALTER TABLE table_name MODIFY column_name
[ CONSTRAINT constraint_name ] NOT NULL;
注意,此时是alter ... modify 咯,列级嘛。
删除NOT NULL约束
如果需要删除表中的列上的NOT NULL约束,依然是使用ALTER
TABLE … MODIFY语句,形式如下:
ALTER TABLE table_name MODIFY column_name NULL;
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'
)
数据表已经存在
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
删除default约束
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
到目前为止,就not null有点不同而已,大家记住就好咯。
表级约束 应用于表,对表中的多个列起作用,
如primary key,foreign key,unique,check。列级约束 应用于表中的一列,只对该列起作用
,如not null
对于表级约束,写法一般有两种(创建表时),而列级约束一般只有一种
如:
表级check:
只作用于一个列:
CREATE TABLE Persons
(
Id_P number NULL CHECK (Id_P>0),
LastName varchar2(255) NULL,
FirstName varchar2(255),
Address varchar2(255)
)
作用于多个列:
CREATE TABLE Persons
(
Id_P number NULL,
Age number NULL,
LastName varchar2(255) NULL,
FirstName varchar2(255),
Address varchar2(255),
constraint check_name check(Id_P>0 and Age > 0)
)
而列级not null,就只能紧随列定义后加上
CREATE TABLE Persons
(
Id_P number NOT NULL,
Age number NOT NULL,
LastName varchar2(255) NOT NULL,
FirstName varchar2(255) NOT NULL,
Address varchar2(255)
)
有了基于以上的共识后,我们就可以针对每一个约束展开来说了:
1)primary key 主键
PRIMARY KEY约束是指主键约束,用于惟一标识一行记录。在一个表
中只能定义一个
PRIMARY KEY约束,该约束可以定义在单独的列上,也可
以定义在多个列上(表级约束),如
primary key(id)作用于单列,primary key(cert_type,cert_no,client_no)作用于列组。定义
了PRIMARY KEY约束的列或列组合
不能有重复值,也不能有NULL值。
添加主键:
(注:[] 括号内的东西表示可选的,这里如果选,就是命名约束,如果不选,数据库会帮我们命名
一个名字,下同)
在创建表时,为列添加PRIMARY KEY约束,形式如下:
CREATE TABLE table_name (
column_name data_type [ CONSTRAINT constraint_name ]
PRIMARY KEY)
或
CREATE TABLE table_name (
column_name data_type ,
[ CONSTRAINT constraint_name ] PRIMARY KEY (column_name)
)
如果表之前已经创建好的情况:
ALTER TABLE table_name ADD [ CONSTRAINT constraint_name ]
PRIMARY KEY
(column_name);
这里说明一下,对于是表级约束的,修改一般都是 alter ... add这种格式,
而对于列级约束,修改一般是alter ... modify,大家在往下看的时候,可以留个心眼看看是不是
这种情况。
删除primary key约束:
删除列上的PRIMARY KEY约束,需要使用ALTER TABLE … DROP语
句,不过形式上只能采
取指定约束名的方式,如下:
ALTER TABLE table_name DROP CONSTRAIN
constraint_name;
如果在添加约束时使用CONSTRAINT子句为其指定了约束名,那么这里
就可以直接使用该名称。而如果没有使用CONSTRAINT子句,则约束名由
Oracle自动创建,此时就可
以通过连接数据字典user_cons_columns和
user_constraints来查看约束名称。
这里也注意下,表级约束的删除一般是 alter ... drop
而列级约束一般是alter ... modify 就可以胜任了。
foreign key:
FOREIGN KEY约束是指外键约束,用于引用本表或另一个表中的一列
或一组列。引用列与被引用列
可以在同一个表中,这种情况称为“自引用”。
被引用的列或列组应该具有主键约束或惟一约束。
引用列的取值只能为被引用列的值或NULL值。
可以为一个列或一组列定义FOREIGN KEY约束。
如果
引用列中存储了被引用列的某个值,则不能直接删除被引用列中的这个值,否则会与第二条相矛盾
。如果一定要删除,需要先删除引用列中的这个值,然后再删除被引用列中的这个值。(对于理解
外键,这段话挺重要的)
添加FOREIGN KEY约束
在创建表时,为列添加FOREIGN KEY约束,形式如下:CREATE TABLE table_name (
column_name1 data_type [ CONSTRAINT constraint_name ]
REFERENCES table_name2
(column_name2))
或
CREATE TABLE table_name (column_name data_type ,
[ CONSTRAINT constraint_name ] FOREIGN KEY (column_name1,column_name2)
REFERENCES
table_name2 (column_name3,column_name4))
其中,REFERENCES关键字用于定义column_name1列指向其他表
(或本表)中的column_name2列。
也可以为已创建的表中的列添加FOREIGN KEY约束,如下:
ALTER TABLE table_name1 ADD [ CONSTRAINT constraint_name ]
FOREIGN KEY
(column_name1) REFERENCES table_name2
(column_name2);
注意:这里是alter ... add 哦,表级约束就是这样的啦。
check约束,表级约束
CHECK约束是指检查性约束,使用CHECK约束时,将对输入的每一个
数据进行检查,只有符合条件的
记录才会保存到表中,从而保证数据的有
效性和完整性。
CHECK约束具有以下4个特点:
在CHECK约束的表达式中,必须引用表中的一个或者多个列;
并且表达式的运算结果是一个布尔值。
在一个列中,可以定义多个CHECK约束。
对于同一列,可以同时定义CHECK约束和NOT NULL约束。
CHECK约束既可以定义在列级别中,也可以定义在表级别中。
创建表时,为表定义CHECK约束,需要使用CHECK(约束条件)语句。
例如,创建表STUDENT3,为
STUDENTAGE列指定CHECK约束,如下:
SQL>
create table student3(
studentid number(4) not null primary key,
studentcode varchar2(10) unique,studentname varchar2(20),
studentage number(3) constraint stu3_ck check(studentage > 0),tudentaddress
varchar2(40)
);表已创建。
创建表时,列级别
mysql
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
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)
)
创建表时,表级别,命名约束MySQL / SQL Server / OracleCREATE 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')
)
创建表后
MySQL / SQL Server / OracleALTER TABLE Persons
ADD CHECK (Id_P>0)
删除约束
SQL Server / Oracle
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
ALTER TABLE Persons
DROP CHECK chk_Person
UNIQUE约束
UNIQUE约束是指惟一约束,用于要求列中不允许出现重复值。可以为
单独的列添加一个UNIQUE约束
,也可以为多个列添加一个UNIQUE约束
(属于表级约束)。如果为多个列添加一个UNIQUE约束,只
需要保证这多
个列的值不全部相同即可。
添加UNIQUE约束
CREATE TABLE table_name (column_name data_type [ CONSTRAINT constraint_name ]
UNIQUE)
或
CREATE TABLE table_name (
column_name data_type [ CONSTRAINT constraint_name ] UNIQUE (column_name)
也可以为已创建的表中的列添加UNIQUE约束,这时就需要使用ALTER
TABLE … ADD语句,形式如下
ALTER TABLE table_name
ADD [ CONSTRAINT constraint_name ] UNIQUE(column_name);
也是alter ... add 哦,表级的嘛,注意就好。
删除UNIQUE约束
删除列上的UNIQUE约束,可以使用ALTER TABLE … DROP语句,形
式如下:
ALTER TABLE table_name DROP UNIQUE (column_name);
如果约束有名称,也可以使用指定名称的方式删除该约束,语句形式为
如下:
ALTER TABLE table DROP CONSTRAINT constraint_name;
下面就说列级的咯
NOT NULL约束
NOT NULL约束是指非空约束,用于要求向表中添加记录时必须为被约
束的列提供数据,否则将出现
错误。NOT NULL约束只能在列级别上定
义,一个表中可以定义多个NOT NULL约束。
添加NOT NULL约束
在创建表时,为列添加NOT NULL约束,形式如下:
column_name data_type
[ CONSTRAINT constraint_name ] NOT NULL
其中,CONSTRAINT constraint_name表示为约束指定名称。
也可以为已创建的表中的列添加NOT NULL约束,这时就需要使用
ALTER TABLE … MODIFY语句,形
式如下:
ALTER TABLE table_name MODIFY column_name
[ CONSTRAINT constraint_name ] NOT NULL;
注意,此时是alter ... modify 咯,列级嘛。
删除NOT NULL约束
如果需要删除表中的列上的NOT NULL约束,依然是使用ALTER
TABLE … MODIFY语句,形式如下:
ALTER TABLE table_name MODIFY column_name NULL;
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'
)
数据表已经存在
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
删除default约束
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
到目前为止,就not null有点不同而已,大家记住就好咯。