维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
答:
我是这样做的,尽可能使用约束
,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器
,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑
,但这样做麻烦,编程复杂,效率低下。
数据库完整性:
存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性
。
数据库一致性(Database Consistency)
是指事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。保证数据库一致性是指当事务完成时,必须使所有数据都具有一致的状态。在关系型数据库中,所有的规则必须应用到事务的修改上,以便维护所有数据的完整性。
SQL CHECK 约束
Check约束通过逻辑表达式来判断数据的有效性
,用来限制输入一列或多列的值的范围。在列中更新数据时,所要输入的内容必须满足Check约束的条件,否则将无法正确输入。
/*CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数*/ Id_P int NOT NULL CHECK (Id_P>0),
多个
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
新增
ADD CHECK (Id_P>0) ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
撤销
DROP CONSTRAINT chk_Person
Unique约束
唯一约束确保表中的一列数据没有相同的值。与主键约束类似,唯一约束也强制唯一性
,但唯一约束用于非主键的一列或者多列的组合,且一个表可以定义多个唯一约束。
Id-P int NOT NULL UNIQUE
多个
City varchar(255),CONSTRAINT uc-PersonID UNIQUE (Id-P,LastName)
新增
ADD UNIQUE (Id-P)
多个
ADD CONSTRAINT uc-PersonID UNIQUE (Id-P,LastName)
撤销
DROP CONSTRAINT uc-PersonID
Foreign Key约束
外键约束是用来加强两个表(主表和从表)的一列或多列数据之间的连接的。创建外键约束的顺序是先定义主表的主键,然后定义从表的外键。也就是说只有主表的主键才能被从表用来作为外键使用(即,一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY)
,被约束的从表中的列可以不是主键,主表限制了从表更新和插入的操作。
Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
多个
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
新增
ADD CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
撤销
DROP CONSTRAINT fk_PerOrders
primary Key约束
在表中常有一列或多列的组合,其值能唯一标识表中的每一行。
这样的一列或多列成为表的主键(PrimaryKey)。一个表只能有一个主键
,而且主键约束中的列不能为空值。只有主键列才能被作为其他表的外键所创建。
Id_P int NOT NULL PRIMARY KEY
多个
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
新增
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
删除
DROP CONSTRAINT pk_PersonID
Default约束
若在表中定义了默认值约束,用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值赋给该列,如果我们不设置默认值,系统默认为NULL
。
City varchar(255) DEFAULT 'Sandnes'
插入系统值
OrderDate date DEFAULT GETDATE()
新增
ALTER TABLE Persons ALTER COLUMN City SET DEFAULT 'SANDNES'
删除
ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT