SERIAL外键可以设置为null吗?

时间:2014-09-17 06:45:20

标签: sql database postgresql

问题:我有一张带有几个外键的表。我想让两个外键可选(也就是说,它们可以设置为NULL)。当我尝试运行命令来创建表时,我收到错误:

  

错误:表“eventassociation”的列“activityid”的NULL / NOT NULL声明冲突

如果我尝试创建没有外键的NULL声明的表,那些外键隐式变为NOT NULL。

我怎样才能使外键activityIDroleID为空?

谢谢,

hypoz

额外信息

我在ubuntu 12.04上运行postgreSQL(apt-get上的版本)。

这是有问题的表格:

CREATE TABLE eventAssociation (
  associationID SERIAL PRIMARY KEY,
  studentID VARCHAR(12) references volunteers(studentID),
  eventID SERIAL references events(eventID),
  activityID SERIAL references activities NULL,
  roleID SERIAL references roles(roleID) NULL,
  coordinatorConfirmed BOOLEAN,
  userRevokeable BOOLEAN
)

供参考,这是activities表的模式。除了具有不同的字段名称之外,角色表几乎完全相同。

CREATE TABLE activities (
  activityID SERIAL PRIMARY KEY,
  eventID integer references events(eventID),
  name varchar(128),
  description TEXT
)

1 个答案:

答案 0 :(得分:6)

将FK列定义为serial没有任何意义。这意味着每当你不提供一个值时,一个新的id将生成 - 我无法想象任何形成sens的情况。

我认为您确实希望将这些列定义为integer

CREATE TABLE activities 
(
  activityID    SERIAL PRIMARY KEY,
  eventID       INTEGER REFERENCES events,
  name          VARCHAR(128),
  description   TEXT
);

CREATE TABLE eventAssociation 
(
  associationID          SERIAL PRIMARY KEY,
  eventID                INTEGER REFERENCES events,
  activityID             INTEGER REFERENCES activities,
  coordinatorConfirmed   BOOLEAN,
  userRevokeable         BOOLEAN
);