编程全栈开发人员

SQL中的约束(constraints)是什么,有哪些类型的限制,它们如何帮助避免应用逻辑中的错误?请举例说明它们的使用。

用 Hintsage AI 助手通过面试

答案

约束(constraints) 是施加在列或表上的完整性限制,用于自动控制值的有效性。它们允许:

  • 保护数据免受错误输入;
  • 将部分应用逻辑移到数据库中(更安全、更快);
  • 在插入、更新或删除时自动检查条件。

主要约束类型:

  • PRIMARY KEY — 唯一标识符,禁止重复和NULL。
  • UNIQUE — 禁止在同一列中重复值。
  • FOREIGN KEY — 引用完整性,链接到其他表。
  • CHECK — 检查任意表达式。
  • NOT NULL — 禁止列中有NULL值。

示例:

CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id), -- 外键 price DECIMAL(10,2) CHECK (price > 0), created_at TIMESTAMP NOT NULL );

误导性问题

"唯一键(UNIQUE)是否自动NULL安全,排除列中任何数量的NULL值?"

实际上,在大多数数据库管理系统(例如PostgreSQL,MySQL)中,UNIQUE约束允许具有NULL值的多行,因为NULL被视为“未知”。这往往导致空值的隐性重复。

示例:
CREATE TABLE test ( id INT PRIMARY KEY, code VARCHAR(10) UNIQUE ); INSERT INTO test (id, code) VALUES (1, NULL), (2, NULL); -- 会通过

由于不了解主题细微之处而造成的真实错误示例


故事

应用程序允许通过电子邮件注册,列被设置为UNIQUE,但不是NOT NULL — 表中出现了十多个NULL电子邮件的用户,这在与外部服务集成时造成了问题。


故事

在票务系统中忘记为表支付添加FOREIGN KEY — 导致出现未关联任何订单的支付,这妨碍了用户的退款。


故事

对于折扣的CHECK约束: discount > 0。边界情况为0被忽略。结果:系统只接受大于0的折扣,而缺乏折扣(0)破坏了业务逻辑。