创建外键的方法

本文介绍两种创建订单主表和订单详情表的方法。方法一通过直接定义外键约束,方法二则先创建表再添加外键约束。
方法一:
create table OrderMaster
(
OrderID number primary key,
UserName varchar2(20),
OrderDate date
)

create table OrderDetail
(
OrderID number,
PName varchar2(20),
Count number,
constraint FK_OrderID foreign key(OrderID) references OrderMaster(OrderID)
)


方法二:

create table OrderDetail
(
OrderID number,
PName varchar2(20),
Count number
)

alter table OrderDetail
add constraint FK_OrderID foreign key (OrderID) references OrderMaster(OrderID)
<think>我们正在讨论的是在PostgreSQL创建方法和语法。根据引用内容,我们可以总结如下: 1. 创建表时直接定义(基本语法): ```sql CREATE TABLE 子表名 ( 列1 数据类型, 列2 数据类型, ... 列 数据类型 REFERENCES 父表名(父表主列) ); ``` 2. 创建表时使用约束命名(推荐,便于管理): ```sql CREATE TABLE 子表名 ( 列1 数据类型, 列2 数据类型, ... 列 数据类型, CONSTRAINT 约束名 FOREIGN KEY (列) REFERENCES 父表名(父表主列) ); ``` 3. 修改现有表添加: ```sql ALTER TABLE 子表名 ADD CONSTRAINT 约束名 FOREIGN KEY (列) REFERENCES 父表名(父表主列); ``` 4. 约束的高级配置(如级联操作): ```sql -- 在创建表时指定 CREATE TABLE 子表名 ( ... FOREIGN KEY (列) REFERENCES 父表名(父表主列) ON DELETE 动作 [ON UPDATE 动作] ); -- 在修改表时指定 ALTER TABLE 子表名 ADD CONSTRAINT 约束名 FOREIGN KEY (列) REFERENCES 父表名(父表主列) ON DELETE 动作 ON UPDATE 动作; ``` 其中,动作可以是: - `RESTRICT`(默认):如果有子表记录引用,则阻止删除或更新父表记录。 - `CASCADE`:级联删除或更新子表记录。 - `SET NULL`:将子表的列设置为NULL。 - `SET DEFAULT`:将子表的列设置为默认值。 根据引用[3],字段建议创建索引以提高性能。 下面是一个完整的示例: 假设我们有两个表:`departments`(父表)和`employees`(子表)。 首先创建父表: ```sql CREATE TABLE departments ( department_id SERIAL PRIMARY KEY, department_name VARCHAR(50) NOT NULL UNIQUE ); ``` 然后在创建子表时定义(带级联删除): ```sql CREATE TABLE employees ( employee_id SERIAL PRIMARY KEY, employee_name VARCHAR(100) NOT NULL, department_id INT NOT NULL, CONSTRAINT fk_employee_department FOREIGN KEY (department_id) REFERENCES departments(department_id) ON DELETE CASCADE ); ``` 或者,如果已经存在`employees`表,但没有,我们可以通过`ALTER TABLE`添加: ```sql ALTER TABLE employees ADD CONSTRAINT fk_employee_department FOREIGN KEY (department_id) REFERENCES departments(department_id) ON DELETE SET NULL; -- 这里示例使用SET NULL ``` 注意:在添加约束前,请确保现有数据中的`department_id`值在`departments`表中都存在,否则会失败。如果存在不匹配的数据,需要先处理这些数据。 最后,为了优化性能,我们可以在列上创建索引(如果还没有索引的话): ```sql CREATE INDEX idx_employees_department_id ON employees (department_id); ``` 总结:创建主要有两种方式——建表时定义和通过`ALTER TABLE`添加。同时,我们可以指定约束的行为(如级联操作)以维护数据完整性[^1][^2][^3]。</think>### PostgreSQL 创建的完整指南 在 PostgreSQL 中,用于**建立表间关联**,确保引用数据的完整性。以下是创建的详细方法和语法: #### 一、基本创建方法 1. **建表时直接定义**(简洁语法): ```sql CREATE TABLE 子表 ( 列1 数据类型, 列 数据类型 REFERENCES 父表(主列) -- 直接引用[^1] ); ``` **示例**: ```sql CREATE TABLE employees ( id SERIAL PRIMARY KEY, department_id INT REFERENCES departments(id) -- 引用部门表 ); ``` 2. **显式命名约束**(推荐做法): ```sql CREATE TABLE 子表 ( ... CONSTRAINT 约束名称 FOREIGN KEY (列) REFERENCES 父表(主列) -- 命名约束便于管理[^2] ); ``` **示例**: ```sql CREATE TABLE orders ( order_id SERIAL PRIMARY KEY, customer_id INT, CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ); ``` #### 二、修改现有表添加 ```sql ALTER TABLE 子表 ADD CONSTRAINT 约束名称 FOREIGN KEY (列) REFERENCES 父表(主列); -- 为已存在表添加约束[^1] ``` **示例**: ```sql -- 先创建两个表 CREATE TABLE departments (id SERIAL PRIMARY KEY); CREATE TABLE employees (dept_id INT); -- 添加约束 ALTER TABLE employees ADD CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(id); ``` #### 三、高级配置(约束行为) 通过 `ON DELETE` 和 `ON UPDATE` 控制级联操作: ```sql CREATE TABLE 子表 ( ... FOREIGN KEY (列) REFERENCES 父表(主列) ON DELETE 动作 -- 删除父表记录时的行为 ON UPDATE 动作 -- 更新父表主时的行为 ); ``` **常用约束行为**: | 动作 | 效果 | |--------------|----------------------------------------------------------------------| | `RESTRICT` | 阻止操作(默认) - 存在关联数据时禁止删除/更新父表记录[^3] | | `CASCADE` | 级联操作 - 父表记录删除/更新时,自动删除/更新子表关联记录 | | `SET NULL` | 设为 NULL - 父表记录删除/更新时,子表列设为 NULL | | `SET DEFAULT`| 设为默认值 - 子表列设为预设默认值 | **示例**: ```sql CREATE TABLE order_items ( order_id INT REFERENCES orders(id) ON DELETE CASCADE -- 订单删除时自动删除所有商品项 ON UPDATE SET NULL -- 订单ID更新时商品项order_id置空 ); ``` #### 四、最佳实践 1. **索引优化**:列**必须创建索引**以提高关联查询性能[^3] ```sql CREATE INDEX idx_表名_列 ON 子表(列); ``` 2. **命名规范**:使用 `fk_子表_父表` 格式命名约束 3. **数据验证**:添加约束前确保值在父表中存在 ```sql -- 检查无效数据 SELECT * FROM 子表 WHERE 列 NOT IN (SELECT 主列 FROM 父表); ``` 4. **级联慎用**:`ON DELETE CASCADE` 可能导致意数据删除 #### 五、完整示例 ```sql -- 父表 CREATE TABLE products ( product_id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL ); -- 子表(带约束) CREATE TABLE inventory ( item_id SERIAL PRIMARY KEY, product_id INT NOT NULL, quantity INT CHECK (quantity > 0), CONSTRAINT fk_inv_product FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE RESTRICT ON UPDATE CASCADE ); -- 添加索引 CREATE INDEX idx_inventory_product ON inventory(product_id); ``` > **提示**:使用 `\d+ 表名` 查看表结构时,约束会显示在 "Foreign-key constraints" 部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值