SQL - 约束:数据完整性的关键
你好,未来的数据库大师们!我很高兴能成为你们在这个激动人心的SQL约束世界中的向导。作为一个教授SQL超过十年的人,我可以向你保证,理解约束就像在数据库管理中解锁了一个秘密超级能力。那么,让我们开始吧!
SQL约束是什么?
想象你正在搭一叠纸牌屋。每张牌都需要放得恰到好处,否则整个结构可能会崩溃。SQL约束就像是保持你的数据库“纸牌屋”稳固的规则。它们确保你表中的数据遵循特定的规则,保持准确性和一致性。
为什么约束重要?
让我分享一个快速的故事。我曾经有一个学生在没有使用约束的情况下为宠物店建立一个数据库。有一天,他们意外地输入了一个负数的狗价。突然间,人们开始领养狗赚钱了!那是一片混乱(但狗们很高兴)。这就是为什么我们需要约束 - 防止这些既滑稽又有问题的情况发生。
SQL约束:阵容
这是我们即将探讨的主要SQL约束表格:
约束 | 描述 |
---|---|
NOT NULL | 确保列不能有NULL值 |
UNIQUE | 确保列中的所有值都是不同的 |
PRIMARY KEY | NOT NULL和UNIQUE的组合 |
FOREIGN KEY | 确保表之间有引用完整性 |
CHECK | 确保列中的所有值满足特定条件 |
DEFAULT | 为列设置默认值 |
INDEX | 用于快速创建和检索数据库数据 |
现在,让我们一个一个地分解这些。
在SQL中创建约束
约束可以在创建表时添加,或者稍后使用ALTER TABLE语句添加。让我们从一个为我们的想象宠物店创建的简单表开始:
CREATE TABLE pets (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
species VARCHAR(50) NOT NULL,
age INT CHECK (age >= 0),
price DECIMAL(10, 2) NOT NULL CHECK (price > 0),
adoption_date DATE DEFAULT NULL
);
这个简单的表已经包含了几种约束。让我们分解它们:
NOT NULL约束
NOT NULL约束确保列不能有NULL值。在我们的例子中,'id'、'name'、'species'和'price'都是NOT NULL。这意味着每只宠物都必须填写这些详细信息。
name VARCHAR(50) NOT NULL,
UNIQUE键约束
虽然我们没有在这里显式地使用UNIQUE,但值得一提。UNIQUE约束确保列中的所有值都是不同的。例如,如果我们想让每个宠物都有一个唯一的微芯片号码:
ALTER TABLE pets
ADD COLUMN microchip_number VARCHAR(20) UNIQUE;
DEFAULT值约束
DEFAULT约束为列提供一个默认值,当没有指定值时使用。在我们的例子中,'adoption_date'有一个DEFAULT NULL,这意味着如果没有提供日期,它将是NULL。
adoption_date DATE DEFAULT NULL
PRIMARY键约束
PRIMARY KEY约束唯一标识表中的每条记录。它是NOT NULL和UNIQUE的组合。在我们的表中,'id'是主键:
id INT NOT NULL PRIMARY KEY,
FOREIGN键约束
FOREIGN KEY约束用于防止破坏表之间链接的操作。让我们添加一个所有者表并将其链接到我们的宠物表:
CREATE TABLE owners (
owner_id INT NOT NULL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
ALTER TABLE pets
ADD COLUMN owner_id INT,
ADD CONSTRAINT fk_owner
FOREIGN KEY (owner_id) REFERENCES owners(owner_id);
现在,你不能添加一个拥有不存在于所有者表中的owner_id的宠物。这就像确保每个宠物都有一个真正的家!
CHECK值约束
CHECK约束确保列中的所有值满足特定条件。在我们的宠物表中,我们用它来确保年龄和价格是正数:
age INT CHECK (age >= 0),
price DECIMAL(10, 2) NOT NULL CHECK (price > 0),
INDEX约束
虽然严格来说不是约束,但INDEX对数据库性能至关重要。它们就像书后面的索引,帮助SQL快速找到数据:
CREATE INDEX idx_species ON pets(species);
这会在species列上创建一个索引,使按species列搜索数据更快。
删除SQL约束
有时,你可能需要删除一个约束。以下是如何操作的:
ALTER TABLE pets
DROP CONSTRAINT check_price;
这将删除price列上的CHECK约束。
数据完整性约束:整合在一起
所有这些约束一起工作,确保数据完整性。它们就像是你的数据库的免疫系统,保护它免受不良数据的侵害。让我们看一个更复杂的例子:
CREATE TABLE adoptions (
adoption_id INT NOT NULL PRIMARY KEY,
pet_id INT NOT NULL,
owner_id INT NOT NULL,
adoption_date DATE DEFAULT CURRENT_DATE,
adoption_fee DECIMAL(10, 2) CHECK (adoption_fee >= 0),
FOREIGN KEY (pet_id) REFERENCES pets(id),
FOREIGN KEY (owner_id) REFERENCES owners(owner_id),
UNIQUE (pet_id, adoption_date)
);
这个表确保:
- 每次领养都有一个唯一的ID(PRIMARY KEY)
- 每次领养都与有效的宠物和所有者相关联(FOREIGN KEY)
- 领养费用不能是负数(CHECK)
- 如果没有指定领养日期,则默认为今天(DEFAULT)
- 同一天内不能重复领养同一只宠物(UNIQUE组合)
就这样了!你现在已经装备齐全,可以用SQL约束来保持你的数据库干净、一致且无错误。记住,一个约束良好的数据库是一个快乐的数据库。快乐编码,未来的数据大师们!
Credits: Image by storyset