2014-09-17 4 views
1

Вопрос: У меня есть таблица с несколькими внешними ключами. Я хочу сделать два внешних ключа необязательными (то есть их можно установить в NULL). Когда я пытаюсь запустить команду, чтобы создать таблицу, я получаю ошибку:Может ли ключ SERIAL быть установлен на нуль?

ERROR: conflicting NULL/NOT NULL declarations for column "activityid" of table "eventassociation"

Если я пытаюсь создать таблицу без объявления NULL для внешних ключей, эти внешние ключи неявно становятся NOT NULL.

Как я могу сделать так, чтобы внешние ключи activityID и roleID могут быть пустыми?

Спасибо,

hypoz

Дополнительная информация:

Я бегу PostGreSQL (версия на кв-получить) на Ubuntu 12.04.

Это проблематично таблица:

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 
) 

ответ

4

Определение столбца, который является FK, как serial не имеет никакого смысла. Это означает, что всякий раз, когда вы не укажете значение, новый идентификатор будет сгенерирован - Я не могу представить, какая ситуация может возникнуть.

Я думаю, что вы на самом деле хотите, чтобы определить эти столбцы как 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 
);
+0

Ах, я был под впечатлением, что 'SERIAL' был синонимом для' integer'. Я полагаю, что я ошибаюсь, и серийный фактически означает целое число с последовательностью? –

+0

Это решение отлично работает, спасибо. –

+0

@ 64bit_twitchyliquid Вы можете прочитать подробную информацию о 'SERIAL' здесь: http://www.postgresql.org/docs/current/static/datatype-numeric.html –

Смежные вопросы