主键约束
CREATE TABLE trainings (
employee_id INT,
course_id INT,
taken_date DATE,
PRIMARY KEY (employee_id , course_id)
);
PRIMARY KEY (employee_id , course_id)
与 CONSTRAINT id PRIMARY KEY (employee_id , course_id)
的区别:
在 SQL
语言中,CREATE TABLE
语句中的 PRIMARY KEY
和 CONSTRAINT
关键字可以用来定义主键。
它们的作用是相同的,都可以用于定义表的主键约束。
在这个例子中,使用 PRIMARY KEY
关键字定义了主键约束,它将 employee_id
和 course_id
这两个列组合在一起形成了一个复合主键。
这种写法是比较常见的,尤其是在定义表的时候就明确指定主键时,更倾向于使用 PRIMARY KEY
语法。
而如果你想在表定义之后,再添加主键约束,或者想为主键约束指定名称、指定其他的约束条件等,则可以使用 CONSTRAINT
关键字。
例如,下面的语句在创建表时没有明确指定主键,而是使用 CONSTRAINT
关键字在表创建之后添加了主键约束,并且指定了主键约束的名称为 id
:
CREATE TABLE trainings (
employee_id INT,
course_id INT,
taken_date DATE,
CONSTRAINT id PRIMARY KEY (employee_id , course_id)
);
添加主键约束
ALTER TABLE table_name
ADD CONSTRAINT PK_table_name PRIMARY KEY (id);
删除主键约束
ALTER TABLE table_name
DROP CONSTRAINT PK_table_name;
外键约束
当定义外键约束后,它会确保数据在引用两个表之间建立联系时保持一致性。
下面是一个实际例子,说明了外键约束的作用:
假设有两个表 employees
和 departments
,其中 employees
表包含有关公司员工的信息,departments
表包含有关公司部门的信息。
为了确保这两个表之间的数据一致性,我们可以在 employees
表中添加一个外键,用于引用 departments
表中的部门 ID
。
首先,我们需要在 departments
表中创建一个主键,以便在 employees
表中引用它。
下面是 departments
表的示例定义:
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(50)
);
然后,我们可以在 employees
表中添加一个 department_id
列,作为外键列。
外键约束将确保在 employees
表中插入或更新数据时,只能引用在 departments
表中已经存在的部门 ID
。
下面是 employees
表的示例定义:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
employee_name VARCHAR(50),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
在这个示例中,employees
表中的 department_id
列是外键列,departments
表中的 department_id
列是主键列。
外键约束确保在 employees
表中插入或更新数据时,只能引用在 departments
表中已经存在的部门 ID
。
例如,如果尝试向 employees
表中插入一个不存在的部门 ID
,则将引发外键约束错误。
同样,如果尝试将 employees
表中的 department_id
更新为一个不存在的部门 ID
,则也将引发外键约束错误。
总之,外键约束确保了关系数据库中的数据一致性,可以防止引用另一个表中不存在的数据。
在上面的例子中,外键约束确保了 employees
表中的 department_id
只引用 departments
表中已经存在的部门 ID
。
添加外键约束
ALTER TABLE orders
ADD CONSTRAINT fk_customer_id
FOREIGN KEY (customer_id) REFERENCES customers(customer_id);
删除外键约束
ALTER TABLE orders
DROP CONSTRAINT fk_customer_id;
唯一约束
在数据库中,UNIQUE
约束用于确保一列或多列的值在表中是唯一的。
当将 UNIQUE
约束添加到表的一列或多列时,任何尝试插入具有重复值的行的操作都将失败。
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
email VARCHAR(100) UNIQUE,
password VARCHAR(100)
);
在上面的示例中,我们在 username
和 email
列上添加了 UNIQUE
约束。
这意味着无法插入具有相同用户名或电子邮件地址的行。同时,我们还为 id
列添加了 PRIMARY KEY
约束,确保每个行都有唯一的标识符。
添加唯一约束
如果在已存在的表格上添加唯一约束,您需要使用 ALTER TABLE
语句。例如:
ALTER TABLE users
ADD CONSTRAINT unique_username UNIQUE (username);
删除唯一约束
ALTER TABLE users
DROP CONSTRAINT unique_username;
NOT NULL约束
列约束:
CREATE TABLE table_name (
column_name data_type NOT NULL
);
表约束:
CREATE TABLE table_name (
column1_name data_type,
column2_name data_type,
...
CONSTRAINT constraint_name NOT NULL (column1_name, column2_name, ...)
);
添加NOT NULL约束
可以使用 MODIFY
:
ALTER TABLE table_name
MODIFY column_name data_type NOT NULL;
也可以使用 ADD CONTRAINT
:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name CHECK (column_name IS NOT NULL);
虽然使用 ADD CONSTRAINT
可以在一条 ALTER TABLE
语句中同时添加多个约束,但对于添加 NOT NULL
约束来说,使用 MODIFY
语句通常更简单直接。
使用 MODIFY
语句,您可以在一条语句中同时指定列名、数据类型和 NOT NULL
约束,而使用 ADD CONSTRAINT
则需要在约束中指定表达式来确保列不为空。因此,对于只需要添加单个约束的情况,使用 MODIFY
语句可能更加便捷。
删除NOT NULL约束
ALTER TABLE table_name
ALTER COLUMN column_name DROP NOT NULL;
或者:
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;
CHECK约束
CHECK
约束是关系数据库中的一种完整性约束,它用于限制表中某个列的取值范围,确保每一行数据都符合特定的条件。
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT CHECK (age >= 0 AND age <= 150),
gender VARCHAR(10) CHECK (gender IN ('男', '女')),
score INT
);
添加CHECK约束
ALTER TABLE student
ADD CONSTRAINT age_constraint CHECK (age >= 0 AND age <= 150);
删除CHECK约束
ALTER TABLE student
DROP CONSTRAINT age_constraint;