mysql之表的约束完整性

MySQL表的完整性约束详细介绍 在数据库设计中,确保数据的准确性和一致性至关重要。MySQL通过完整性约束机制帮助实现这一目标,防止存储不正确或不一致的数据。本文将详细介绍MySQL中常见的完整性约束,包括NotNull约束、Unique约束、Primary Key约束、Foreign Key约束和Check约束,并通过具体的代码例子进行说明。

1. NotNull约束

NotNull约束确保列中不能存储NULL值。这对于那些必须有值的列非常重要。 例子:

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) NOT NULL
);

在这个例子中,nameemail列都有NotNull约束,意味着在插入或更新记录时,这两个列必须有值。

2. Unique约束

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都是唯一的。

3. Primary Key约束

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,确保了唯一性和非空性。

4. Foreign 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列,确保每个订单都关联到一个有效的员工。

5. Check约束

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之间。

6. 修改表的约束

使用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;

7. 查看表的约束

可以使用INFORMATION_SCHEMA数据库来查看表的约束。

SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'students';

8. 约束的影响

  • 优点:
    • 确保数据的准确性和一致性。

    • 防止存储不正确或不一致的数据。

    • 简化应用程序的逻辑。

    • 提供数据完整性保障,有助于遵守法规和标准。

  • 缺点:
    • 可能会影响性能,尤其是在大量数据插入或更新时。

    • 增加了数据库 schema 的复杂性。

    • 禁用约束可能带来数据不一致的风险。


9. 最佳实践

  • 始终为必须有值的列定义NotNull约束。

  • 使用Unique约束确保唯一性,当Primary Key不适用时。

  • 使用Primary Key约束唯一标识表中的每一行。

  • 使用Foreign Key约束 enforce 表之间的引用完整性。

  • 使用Check约束 enforce 业务规则和数据有效性。

  • 定期审查和维护约束,确保它们满足业务需求。

  • 考虑约束对性能的影响并进行优化。


10. 复杂例子

以下是一个结合多个约束的复杂例子:

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列上,nameaddress列有NotNull约束。

  • authors表有一个Primary Key约束在author_id列上,nameemail列有NotNull约束,email列还有Unique约束。

  • books表有一个Primary Key约束在book_id列上,title列有NotNull约束,author_idpublisher_id列有Foreign Key约束,price列有一个Check约束,确保价格非负。

  • orders表有一个Primary Key约束在order_id列上,book_id列有Foreign Key约束,customer_nameorder_date列有NotNull约束,quantity列有一个Check约束,确保数量大于0。


通过本文,我们详细介绍了MySQL中表的完整性约束,包括NotNull约束、Unique约束、Primary Key约束、Foreign Key约束和Check约束,并通过具体的代码例子展示了它们的使用方法和作用。合理使用这些约束可以确保数据库中的数据准确、一致且可靠。同时,也需要注意约束对性能的影响,并遵循最佳实践进行数据库设计和维护。

你可能感兴趣的:(mysql,mysql)