【问题标题】:Primary key for multiple column in PostgreSQL?PostgreSQL中多列的主键?
【发布时间】:2014-06-25 08:07:26
【问题描述】:

如何使用 PostgreSQL 为单个表中的多个列提供主键?

例子:

Create table "Test" 
(
   "SlNo" int not null primary key,
   "EmpID" int not null, /* Want to become primary key */
   "Empname" varchar(50) null,
   "EmpAddress" varchar(50) null
);

注意:我想让"EmpID" 也成为主键。

【问题讨论】:

  • 我不确定我是否完全理解,您是要创建一个包含两列的主键,还是两个完全独立的键?
  • @Joachim Isaksson,两列的单一主键。

标签: postgresql database-design primary-key ddl composite-primary-key


【解决方案1】:

每个表只能有 一个 主键 - 如“主”一词所示。
你可以有额外的UNIQUE columns 喜欢:

CREATE TABLE test(
   sl_no int PRIMARY KEY,  -- NOT NULL due to PK
   emp_id int UNIQUE NOT NULL,
   emp_name text,
   emp_addr text
);

属于PRIMARY KEY (一部分)的列会自动标记为NOT NULL

或者使用表约束而不是列约束来创建单个multicolumn primary key。这在语义上与上述不同:现在,只有两列的组合必须是唯一的,每一列都可以单独保存重复项。

CREATE TABLE test(
   sl_no int,     -- NOT NULL due to PK below
   emp_id int ,   -- NOT NULL due to PK below
   emp_name text,
   emp_addr text,
   PRIMARY KEY (sl_no, emp_id)
);

多列UNIQUE 约束也是可能的。

旁白:不要在 Postgres 中使用 CaMeL 大小写标识符。使用合法的小写标识符,这样您就不必使用双引号。让您的生活更轻松。见:

【讨论】:

  • 对于新手也非常有用的关于 CaMeL 案例的提示 - 谢谢 :-)
【解决方案2】:

我觉得可以。

Create table "Test" 
(
   "SlNo" int ,
   "EmpID" int , 
   "Empname" text),
   "EmpAddress" text,
   PRIMARY KEY (SlNo, EmpID)
);

【讨论】:

  • 这有什么用?
  • 每次使用 Pascal 大小写的引号似乎很麻烦。另外,请注意这些括号。
【解决方案3】:

如果要指定主键约束的名称:

CREATE TABLE test(
   sl_no int not null,
   emp_id int not null,
   emp_name text,
   emp_addr text,
   constraint pk_test primary key (sl_no, emp_id)
);

来源:https://www.postgresqltutorial.com/postgresql-primary-key/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多