在SQL中,约束(Constraints)是用来规定表中的数据规则的机制,如果存在违反约束的数据行为,这些行为会被终止,约束可以在创建表时规定(通过CREATE TABLE语句),或者在表创建之后规定(通过ALTER TABLE语句),以下是几种常见的SQL约束及其使用示例:
1. NOT NULL 约束
NOT NULL 约束强制列不接受NULL值,这意味着如果不向字段添加值,就无法插入新记录或更新记录。
CREATE TABLE Persons ( PersonID int NOT NULL, Name varchar(255) NOT NULL, Address varchar(255), City varchar(255) );
在这个例子中,PersonID
和Name
列被强制为非空。
2. UNIQUE 约束
UNIQUE约束确保某列的每行必须有唯一的值。
CREATE TABLE Orders ( OrderID int NOT NULL, CustomerID int, EmployeeID int, OrderDate datetime, ShipmentID int, UNIQUE (OrderID) );
在这个例子中,OrderID
列被设置为唯一约束。
3. PRIMARY KEY 约束
PRIMARY KEY约束是NOT NULL和UNIQUE的结合,用于确保某列(或多列)有唯一标识,每个表只能有一个PRIMARY KEY约束。
CREATE TABLE Persons ( PersonID int PRIMARY KEY, Name varchar(255) NOT NULL, Address varchar(255), City varchar(255) );
在这个例子中,PersonID
列被设置为主键。
4. FOREIGN KEY 约束
FOREIGN KEY约束用于确保一个表中的数据匹配另一个表中的值的参照完整性。
CREATE TABLE Orders ( OrderID int NOT NULL, CustomerID int, EmployeeID int, OrderDate datetime, ShipmentID int, CONSTRAINT FK_Customer FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) );
在这个例子中,CustomerID
列被设置为外键,引用Customers
表中的CustomerID
列。
5. CHECK 约束
CHECK约束用于保证列中的值符合指定的条件。
CREATE TABLE Products ( ProductID int PRIMARY KEY, ProductName varchar(255), QuantityPerUnit int, Price decimal(8,2) CHECK (Price >= 0) );
在这个例子中,Price
列被设置为检查约束,确保价格大于等于零。
6. DEFAULT 约束
DEFAULT约束用于规定没有给列赋值时的默认值。
CREATE TABLE Orders ( OrderID int NOT NULL, OrderDate datetime NOT NULL DEFAULT GETDATE() );
在这个例子中,OrderDate
列被设置为默认约束,默认值为当前日期和时间。
常见问题及解决方案
问题1: SQL Server插入数据出现约束失败的情况?
解答: 这种情况通常是由于外键约束引起的,插入数据时,外键引用的记录不存在,会导致冲突,可以通过先插入被引用的记录来解决此问题,在课程表中插入课程号前,确保课程号已经存在。
先插入课程号为6的记录 INSERT INTO Courses (Cno, Cname) VALUES (6, 'Math'); 再插入其他记录 INSERT INTO Courses (Cno, Cname) VALUES (4, 'English');
问题2: 如何修改已存在的表以添加或删除约束?
解答: 可以使用ALTER TABLE语句来添加或删除约束。
添加NOT NULL约束到City列 ALTER TABLE Persons ALTER COLUMN City varchar(255) NOT NULL; 删除NOT NULL约束从City列 ALTER TABLE Persons ALTER COLUMN City varchar(255);
注意:在添加和删除NOT NULL约束时,使用的命令可能因数据库管理系统的不同而有所不同,SQL Server不支持ALTER COLUMN命令,需要使用MODIFY命令。