NotNull约束确保列中不能存储NULL值。这对于那些必须有值的列非常重要。 例子:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL
);
name
和email
列都有NotNull约束,意味着在插入或更新记录时,这两个列必须有值。Unique约束确保列中的所有值都是唯一的。这对于确保数据的唯一性非常重要。 例子:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
employee_id VARCHAR(10) UNIQUE,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL
);
employee_id
列有一个Unique约束,确保每个员工的ID都是唯一的。Primary Key约束是一个Unique约束,但它还隐式地包含了NotNull约束,并且一个表只能有一个Primary Key。 例子:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
employee_id VARCHAR(10) UNIQUE,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL
);
id
列是Primary Key,确保了唯一性和非空性。Foreign Key约束用于确保表之间的引用完整性。它确保一个表中的列的值存在于另一个表的指定列中。 例子:
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
employee_id INT,
order_date DATETIME,
FOREIGN KEY (employee_id) REFERENCES employees(id)
);
orders
表中的employee_id
列引用了employees
表中的id
列,确保每个订单都关联到一个有效的员工。Check约束用于确保列中的值满足特定的条件。 例子:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
employee_id VARCHAR(10) UNIQUE,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL,
age INT CHECK (age >= 18 AND age <= 65)
);
age
列有一个Check约束,确保年龄在18到65之间。使用ALTER TABLE
语句可以添加或删除约束。 添加NotNull约束:
ALTER TABLE students MODIFY name VARCHAR(100) NOT NULL;
删除NotNull约束:
ALTER TABLE students MODIFY name VARCHAR(100);
添加Unique约束:
ALTER TABLE students ADD UNIQUE (email);
删除Unique约束:
ALTER TABLE students DROP INDEX email;
添加Primary Key约束:
ALTER TABLE students ADD PRIMARY KEY (student_id);
删除Primary Key约束:
ALTER TABLE students DROP PRIMARY KEY;
添加Foreign Key约束:
ALTER TABLE students ADD FOREIGN KEY (class_id) REFERENCES classes(class_id);
删除Foreign Key约束:
ALTER TABLE students DROP FOREIGN KEY constraint_name;
可以使用INFORMATION_SCHEMA
数据库来查看表的约束。
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'students';
确保数据的准确性和一致性。
防止存储不正确或不一致的数据。
简化应用程序的逻辑。
提供数据完整性保障,有助于遵守法规和标准。
可能会影响性能,尤其是在大量数据插入或更新时。
增加了数据库 schema 的复杂性。
禁用约束可能带来数据不一致的风险。
始终为必须有值的列定义NotNull约束。
使用Unique约束确保唯一性,当Primary Key不适用时。
使用Primary Key约束唯一标识表中的每一行。
使用Foreign Key约束 enforce 表之间的引用完整性。
使用Check约束 enforce 业务规则和数据有效性。
定期审查和维护约束,确保它们满足业务需求。
考虑约束对性能的影响并进行优化。
以下是一个结合多个约束的复杂例子:
CREATE TABLE publishers (
publisher_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
address VARCHAR(255) NOT NULL
);
CREATE TABLE authors (
author_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL
);
CREATE TABLE books (
book_id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
author_id INT,
publisher_id INT,
publication_year YEAR,
price DECIMAL(10, 2) CHECK (price >= 0),
FOREIGN KEY (author_id) REFERENCES authors(author_id),
FOREIGN KEY (publisher_id) REFERENCES publishers(publisher_id)
);
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
book_id INT,
customer_name VARCHAR(100) NOT NULL,
order_date DATETIME NOT NULL,
quantity INT CHECK (quantity > 0),
FOREIGN KEY (book_id) REFERENCES books(book_id)
);
在这个例子中:
publishers
表有一个Primary Key约束在publisher_id
列上,name
和address
列有NotNull约束。
authors
表有一个Primary Key约束在author_id
列上,name
和email
列有NotNull约束,email
列还有Unique约束。
books
表有一个Primary Key约束在book_id
列上,title
列有NotNull约束,author_id
和publisher_id
列有Foreign Key约束,price
列有一个Check约束,确保价格非负。
orders
表有一个Primary Key约束在order_id
列上,book_id
列有Foreign Key约束,customer_name
和order_date
列有NotNull约束,quantity
列有一个Check约束,确保数量大于0。
通过本文,我们详细介绍了MySQL中表的完整性约束,包括NotNull约束、Unique约束、Primary Key约束、Foreign Key约束和Check约束,并通过具体的代码例子展示了它们的使用方法和作用。合理使用这些约束可以确保数据库中的数据准确、一致且可靠。同时,也需要注意约束对性能的影响,并遵循最佳实践进行数据库设计和维护。