推荐答案
在 PostgreSQL 中,可以通过以下两种方式定义外键:
在创建表时定义外键:
CREATE TABLE orders ( order_id SERIAL PRIMARY KEY, product_id INT REFERENCES products(product_id), quantity INT );
在已有表中添加外键:
ALTER TABLE orders ADD CONSTRAINT fk_product FOREIGN KEY (product_id) REFERENCES products(product_id);
本题详细解读
1. 在创建表时定义外键
在创建表时,可以直接在列定义中使用 REFERENCES
关键字来指定外键。这种方式简洁明了,适合在创建表时就明确外键关系的情况。
语法:
CREATE TABLE table_name ( column_name data_type REFERENCES referenced_table(referenced_column) );
示例:
CREATE TABLE orders ( order_id SERIAL PRIMARY KEY, product_id INT REFERENCES products(product_id), quantity INT );
在这个示例中,
orders
表中的product_id
列是一个外键,它引用了products
表中的product_id
列。
2. 在已有表中添加外键
如果表已经存在,可以使用 ALTER TABLE
语句来添加外键约束。这种方式适合在表已经创建后,需要添加外键的情况。
语法:
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column_name) REFERENCES referenced_table(referenced_column);
示例:
ALTER TABLE orders ADD CONSTRAINT fk_product FOREIGN KEY (product_id) REFERENCES products(product_id);
在这个示例中,
fk_product
是外键约束的名称,product_id
是orders
表中的外键列,它引用了products
表中的product_id
列。
3. 外键约束的行为
外键约束可以定义在删除或更新时的行为,常见的行为包括:
CASCADE:当主表中的记录被删除或更新时,自动删除或更新从表中的相关记录。
SET NULL:当主表中的记录被删除或更新时,将从表中的外键列设置为
NULL
。RESTRICT:阻止删除或更新主表中的记录,如果从表中有相关记录存在。
NO ACTION:与
RESTRICT
类似,但在某些情况下可能会有不同的行为。示例:
CREATE TABLE orders ( order_id SERIAL PRIMARY KEY, product_id INT REFERENCES products(product_id) ON DELETE CASCADE, quantity INT );
在这个示例中,当
products
表中的某个product_id
被删除时,orders
表中所有引用该product_id
的记录也会被自动删除。