Я новый в PostgreSQL. У меня есть 3 таблицы, одна таблица ссылается на первичные ключи другой 2 таблицы. Но я не мог вставить данные в Table3
. Смотрите код ниже:
DROP TABLE Table1 CASCADE;
CREATE TABLE Table1(
"DataID" bigint NOT NULL DEFAULT '0',
"AdData" integer DEFAULT NULL,
PRIMARY KEY ("DataID")
);
DROP TABLE IF EXISTS Table2 CASCADE;
CREATE TABLE Table2 (
"Address" numeric(20) NOT NULL DEFAULT '0',
"Value" numeric(20) DEFAULT NULL,
PRIMARY KEY ("Address")
);
DROP TABLE IF EXISTS Table3 CASCADE;
CREATE TABLE table3 (
"ID" bigint NOT NULL DEFAULT '0',
"DataID" bigint DEFAULT NULL,
"Address" numeric(20) DEFAULT NULL,
"Data" bigint DEFAULT NULL,
PRIMARY KEY ("ID"),
FOREIGN KEY ("DataID") REFERENCES Table1("DataID") on delete cascade on update cascade,
FOREIGN KEY ("Address") REFERENCES Table2("Address") on delete cascade on update cascade
);
ОШИБКА: вставка или обновление таблицы «Table3» нарушает ограничение внешнего ключа «Table3_DataID_fkey» DETAIL: Ключ (DataID) = (27856) отсутствует в таблице «Table1».
Когда я попытался вставить данные в 3 таблицы, произошла ошибка. Я сослался на документацию по postgreSQL и изменил свой код следующим образом: (К сожалению, он показал другую ошибку)
DROP TABLE Table1 CASCADE;
CREATE TABLE Table1(
"DataID" bigint NOT NULL DEFAULT '0',
"AdData" integer DEFAULT NULL,
PRIMARY KEY ("DataID")
);
DROP TABLE IF EXISTS Table2 CASCADE;
CREATE TABLE Table2 (
"Address" numeric(20) NOT NULL DEFAULT '0',
"Value" numeric(20) DEFAULT NULL,
PRIMARY KEY ("Address")
);
DROP TABLE IF EXISTS Table3 CASCADE;
CREATE TABLE table3 (
"ID" bigint NOT NULL DEFAULT '0',
"DataID" bigint DEFAULT NULL REFERENCES Table1 ON DELETE RESTRICT,
"Address" numeric(20) DEFAULT NULL REFERENCES Table2 ON DELETE CASCADE,
"Data" bigint DEFAULT NULL,
PRIMARY KEY ("ID"),
PRIMARY KEY("DataID", "Address")
);
ОШИБКА: несколько первичных ключей для таблицы «Table3» не допускаются. ЛИНИЯ 65: PRIMARY KEY («DataID», «Address»)
Пожалуйста, помогите мне ... Как я могу создать ссылку?
Я изменил ID
как UNIQUE
и удалил строку PRIMARY KEY ("ID")
. В это время он показывает еще одну ошибку, как:
ОШИБКА: двойное значение ключа нарушает уникальное ограничение "Table3_pkey"
источник
Все зависит от того, что вы хотите сделать с данными.
Первый пример - вы хотите, чтобы во всех таблицах были согласованные данные, но вы пытаетесь вставить значения, которые не соответствуют таблице1.
Второй пример - вы не хотите иметь непротиворечивые данные, но попробуйте заняться чем-то другим, не зная точно, что. Таблица не может иметь более одного первичного ключа.
Третий пример - вы все еще не знаете, чего хотите достичь, и накладываете на столбец UNIQUE ограничение, которое может иметь одно и то же значение несколько раз.
Если вы просто хотите вставить свои данные - избавьтесь от ссылок на внешние ключи в первом примере. Если вы хотите иметь согласованные данные во всех таблицах - выполните очистку данных, а затем вставьте в таблицы С ограничениями внешнего ключа.
tl; dr: вставить ваши данные в Table3 с кодом из первого примера - вставить пропущенные значения в столбец Table1.DataID, который существует в Table3.DataId.
источник