1.PRIMARY KEY约束
2.FOREIGN KEY约束/级联更新删除
3.UNIQUE约束
4.CHECK约束
5. DEFAULT约束
6.在创建约束时忽略无效的数据
7.临时使已存在的约束失效
1.PRIMARY KEY约束
主键一张表只能有一个,唯一且不为空。联合主键中各值也不能为空。
ALTER TABLE test_pk ADD CONSTRAINT pk_test_pk PRIMARY KEY (id,gender)
2.FOREIGN KEY约束/级联更新删除
一张表外键可以有很多个。外键参照的必须是没有重复的值,而主键和Unique都能保证值的不重复。如果不唯一,那么参照了还有什么意义!
通常说外键可以为空,是指当该列属性可以为空时可以insert空值,而不是指所插的值不在被参照表中而改插空值的意思。
ALTER table test_key ADD CONSTRAINT fk_test_key FOREIGN KEY (classid) REFERENCES test_pk (id)
级联: 在默认情况下(NO ACTION)下,不能在被引用表中删除或更新被引用列。如果想实现的功能,需要添加 cascde功能。
PS:当外键引用本表时不允许级联操作,以防死循环。
CREATE TABLE emp_address( add_id int NOT NULL, add_detail varchar(50) NOT NULL, emp_id int, CONSTRAINT fk_test_key FOREIGN KEY (classid) REFERENCES test_pk (id) ON UPDATE NO ACTION, ON DELETE CASCADE )
3.UNIQUE约束
唯一约束和主键不一样,唯一约束不会自动防止你设置一个NULL值,是否允许NULL值取决于表中相应的NULL选项的设置。然而,如果允许使用NULL,那么只能插入一个NULL(虽然一个NULL不等于另外一个NULL但是在唯一约束看来,两个NULL是相等的。)
ALTER TABLE test_pk add CONSTRAINT uniq_test_key UNIQUE (table_id)
4.CHECK约束
ALTER TABLE Customers ADD CONSTRAINT CH_customers CHECK (Date<=GETDATE())
5. DEFAULT约束
当插入的列设有DEFAULT约束,则当没该列时,默认为默认值。
PS 当insert NULL值到DEFAULT约束列时,结果还是NULL。
ALTER TABLE test_pk add CONSTRAINT default_test_key default 'UNKNOW'for tableid
6.在创建约束时忽略无效的数据
当你想在一张已有数据的表内增加约束,而该约束与之前已存在的数据发生冲突时,可以添加WITH NOCHECK 忽略之前的无效的数据。
不能禁用主键或唯一约束。
ALTER TABLE Customers WITH NOCHECK ADD CONSTRAINT CN_Customer CHECK (Phone like '[0-9][0-9][0-9])[0-9][0-9][0-9][0-9][0-9][0-9]')
7.临时使已存在的约束失效
当你想插入的数据和之前已经建好的约束冲突时,可以临时使已存在的约束失效。
只对 CHECK 和FOREIGN KEY 有效。
--临时使约束失效 ALTER TABLE Customers NOCHECK CONSTRAINT CN_Customer --插入不符合约束的数据 insert ... --使约束复原 ALTER TABLE Customers CHECK CONSTRAINT CN_Customer