当前位置:首页 > 虚拟主机 > 正文

pg数据库创建表时如何设置主键和外键关联?

在PostgreSQL(简称pg)数据库中创建表是数据管理的基础操作,通过定义表结构可以存储和管理结构化数据,创建表时需要明确表的名称、列名、数据类型、约束条件等要素,同时还可以通过索引、分区等优化提升查询性能,以下是pg数据库创建表的详细步骤和注意事项。

创建表的基本语法

PostgreSQL创建表的基本语法如下:

pg数据库创建表时如何设置主键和外键关联? 第1张

table_name为表名,需符合数据库对象的命名规范(不能以数字开头、避免保留字等);column_name为列名;data_type为列的数据类型,如INT、VARCHAR、TIMESTAMP等;constraint为列级约束(如NOT NULL、UNIQUE);table_constraints为表级约束(如PRIMARY KEY、FOREIGN KEY)。

常用数据类型

PostgreSQL支持丰富的数据类型,常见类型包括:

  1. 数值类型:SMALLINT(2字节整数)、INT或INTEGER(4字节整数)、BIGINT(8字节整数)、DECIMAL(精确小数)、REAL(单精度浮点数)、DOUBLE PRECISION(双精度浮点数)。
  2. 字符类型:CHAR(n)(定长字符串)、VARCHAR(n)(变长字符串)、TEXT(无长度限制文本)。
  3. 日期时间类型:DATE(日期)、TIME(时间)、TIMESTAMP(日期时间)、INTERVAL(时间间隔)。
  4. 布尔类型:BOOLEAN(值为TRUE/FALSE/NULL)。
  5. 特殊类型:ARRAY(数组类型)、JSON/JSONB(JSON数据)、UUID(唯一标识符)。

约束条件

约束用于保证数据的完整性和一致性,常见约束包括:

pg数据库创建表时如何设置主键和外键关联? 第2张

  1. NOT NULL:列值不能为空,例如name VARCHAR(100) NOT NULL。
  2. UNIQUE:列值必须唯一,例如email VARCHAR(100) UNIQUE。
  3. PRIMARY KEY:主键约束,唯一标识表中的每一行,例如id INT PRIMARY KEY。
  4. FOREIGN KEY:外键约束,用于关联其他表,例如dept_id INT REFERENCES department(id)。
  5. CHECK:条件约束,例如age INT CHECK (age >= 18)。
  6. DEFAULT:默认值,例如status VARCHAR(20) DEFAULT 'active'。

创建表示例

示例1:创建用户表

CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

  • SERIAL是PostgreSQL提供的自增类型,等同于INT + SEQUENCE,自动生成唯一ID。
  • DEFAULT CURRENT_TIMESTAMP为created_at列设置默认值为当前时间。

示例2:创建部门表与员工表(含外键)

CREATE TABLE departments ( id INT PRIMARY KEY, dept_name VARCHAR(100) NOT NULL ); CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(100) NOT NULL, dept_id INT, salary DECIMAL(10,2), FOREIGN KEY (dept_id) REFERENCES departments(id) ON DELETE SET NULL );

  • ON DELETE SET NULL表示当部门表记录被删除时,员工表的dept_id设为NULL。

示例3:使用复杂约束与类型

CREATE TABLE products ( product_id UUID DEFAULT gen_random_uuid() PRIMARY KEY, name VARCHAR(200) NOT NULL, price NUMERIC(10,2) CHECK (price > 0), stock INT DEFAULT 0, attributes JSONB );

  • UUID类型通过gen_random_uuid()函数生成随机唯一标识符。
  • JSONB类型支持高效查询JSON数据。

表的高级特性

  1. 分区表:对于大表,可通过分区(如按范围、列表哈希)提升查询性能,例如按年份分区:

    CREATE TABLE measurement ( id INT, log_date DATE, value NUMERIC ) PARTITION BY RANGE (log_date); CREATE TABLE measurement_y2025 PARTITION OF measurement FOR VALUES FROM ('20250101') TO ('20250101');
  2. 继承表:PostgreSQL支持表继承,子表继承父表的结构和数据,

    CREATE TABLE cities ( name VARCHAR(100), population INT ); CREATE TABLE capitals (country VARCHAR(100)) INHERITS (cities);
  3. 索引优化:创建索引加速查询,

    CREATE INDEX idx_users_email ON users(email);

注意事项

  1. 命名规范:表名和列名建议使用小写字母加下划线(如user_info),避免使用保留字。
  2. 事务管理:创建表操作默认在事务中执行,可通过BEGIN和COMMIT显式控制。
  3. 权限控制:需确保当前用户有CREATE TABLE权限,可通过GRANT授权。
  4. 性能考虑:避免过度使用索引,合理选择数据类型(如BIGINT比VARCHAR存储数字更高效)。

相关问答FAQs

Q1:如何修改已创建的表结构?

A:PostgreSQL提供ALTER TABLE命令修改表结构,例如添加列:ALTER TABLE users ADD COLUMN phone VARCHAR(20);修改列类型:ALTER TABLE users ALTER COLUMN email TYPE VARCHAR(150);删除列:ALTER TABLE users DROP COLUMN phone。

Q2:如何删除表及其数据?

A:使用DROP TABLE命令删除表,例如DROP TABLE users;若需级联删除相关对象(如索引、约束),可使用DROP TABLE users CASCADE;若仅清空表数据保留表结构,使用TRUNCATE TABLE users(比DELETE更快,但不支持事务回滚)。

pg数据库创建表时如何设置主键和外键关联? 第3张

0