Skip to content

主键约束

sql
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 KEYCONSTRAINT 关键字可以用来定义主键。

它们的作用是相同的,都可以用于定义表的主键约束。

在这个例子中,使用 PRIMARY KEY 关键字定义了主键约束,它将 employee_idcourse_id 这两个列组合在一起形成了一个复合主键。

这种写法是比较常见的,尤其是在定义表的时候就明确指定主键时,更倾向于使用 PRIMARY KEY语法。

而如果你想在表定义之后,再添加主键约束,或者想为主键约束指定名称、指定其他的约束条件等,则可以使用 CONSTRAINT关键字。

例如,下面的语句在创建表时没有明确指定主键,而是使用 CONSTRAINT 关键字在表创建之后添加了主键约束,并且指定了主键约束的名称为 id

sql
CREATE TABLE trainings (
  employee_id INT,
  course_id INT,
  taken_date DATE,
  CONSTRAINT id PRIMARY KEY (employee_id , course_id)
);

添加主键约束

sql
ALTER TABLE table_name
ADD CONSTRAINT PK_table_name PRIMARY KEY (id);

删除主键约束

sql
ALTER TABLE table_name
DROP CONSTRAINT PK_table_name;

外键约束

当定义外键约束后,它会确保数据在引用两个表之间建立联系时保持一致性。

下面是一个实际例子,说明了外键约束的作用:

假设有两个表 employeesdepartments,其中 employees 表包含有关公司员工的信息,departments 表包含有关公司部门的信息。

为了确保这两个表之间的数据一致性,我们可以在 employees 表中添加一个外键,用于引用 departments 表中的部门 ID

首先,我们需要在 departments 表中创建一个主键,以便在 employees 表中引用它。

下面是 departments 表的示例定义:

sql
CREATE TABLE departments (
  department_id INT PRIMARY KEY,
  department_name VARCHAR(50)
);

然后,我们可以在 employees 表中添加一个 department_id 列,作为外键列。

外键约束将确保在 employees 表中插入或更新数据时,只能引用在 departments 表中已经存在的部门 ID

下面是 employees 表的示例定义:

sql
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

添加外键约束

sql
ALTER TABLE orders
ADD CONSTRAINT fk_customer_id
FOREIGN KEY (customer_id) REFERENCES customers(customer_id);

删除外键约束

sql
ALTER TABLE orders
DROP CONSTRAINT fk_customer_id;

唯一约束

在数据库中,UNIQUE 约束用于确保一列或多列的值在表中是唯一的。

当将 UNIQUE 约束添加到表的一列或多列时,任何尝试插入具有重复值的行的操作都将失败。

sql
CREATE TABLE users (
  id INT PRIMARY KEY,
  username VARCHAR(50) UNIQUE,
  email VARCHAR(100) UNIQUE,
  password VARCHAR(100)
);

在上面的示例中,我们在 usernameemail 列上添加了 UNIQUE 约束。

这意味着无法插入具有相同用户名或电子邮件地址的行。同时,我们还为 id 列添加了 PRIMARY KEY 约束,确保每个行都有唯一的标识符。

添加唯一约束

如果在已存在的表格上添加唯一约束,您需要使用 ALTER TABLE 语句。例如:

sql
ALTER TABLE users
ADD CONSTRAINT unique_username UNIQUE (username);

删除唯一约束

sql
ALTER TABLE users
DROP CONSTRAINT unique_username;

NOT NULL约束

列约束:

sql
CREATE TABLE table_name (
   column_name data_type NOT NULL
);

表约束:

sql
CREATE TABLE table_name (
  column1_name data_type,
  column2_name data_type,
  ...
  CONSTRAINT constraint_name NOT NULL (column1_name, column2_name, ...)
);

添加NOT NULL约束

可以使用 MODIFY

sql
ALTER TABLE table_name
MODIFY column_name data_type NOT NULL;

也可以使用 ADD CONTRAINT

sql
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约束

sql
ALTER TABLE table_name
ALTER COLUMN column_name DROP NOT NULL;

或者:

sql
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

CHECK约束

CHECK 约束是关系数据库中的一种完整性约束,它用于限制表中某个列的取值范围,确保每一行数据都符合特定的条件。

sql
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约束

sql
ALTER TABLE student
ADD CONSTRAINT age_constraint CHECK (age >= 0 AND age <= 150);

删除CHECK约束

sql
ALTER TABLE student
DROP CONSTRAINT age_constraint;