约束(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)破坏了业务逻辑。