Nano Hash - криптовалюты, майнинг, программирование

ОШИБКА: нет уникального ограничения, соответствующего заданным ключам для ссылочной таблицы abteilung

Я получаю эту ошибку:

ERROR:  there is no unique constraint matching given keys for referenced table "abteilung"

Для этой схемы:

CREATE TABLE Person (
    svnr VARCHAR(40) PRIMARY KEY,
    anschrift VARCHAR(40) NOT NULL,
    name VARCHAR(20) NOT NULL
);

BEGIN;

CREATE TABLE Mitarbeiter (
    svnr VARCHAR(40) PRIMARY KEY REFERENCES Person(svnr),
    beschaeftigt_seit DATE NOT NULL,
    gehalt NUMERIC(5,2),
    CHECK(gehalt > 0),
    abteilung INTEGER NOT NULL,
    krankenhaus INTEGER NOT NULL
);

CREATE TABLE Krankenhaus (
    kid INTEGER PRIMARY KEY DEFAULT nextval('seq_krankenhaus'),
    anschrift VARCHAR(40) NOT NULL,
    name VARCHAR(20) NOT NULL,
    geleitet_von VARCHAR(40) REFERENCES Mitarbeiter(svnr) DEFERRABLE INITIALLY DEFERRED
);

CREATE TABLE Abteilung (
    abid INTEGER DEFAULT nextval('seq_abteilung'),
    name VARCHAR(40) NOT NULL,
    anschrift VARCHAR(40) NOT NULL,
    koordiniert VARCHAR(40) REFERENCES Mitarbeiter(svnr) DEFERRABLE INITIALLY DEFERRED,
    krankenhaus INTEGER REFERENCES Krankenhaus(kid),
    PRIMARY KEY (abid, krankenhaus)
);

ALTER TABLE Mitarbeiter ADD CONSTRAINT fk_abteilung FOREIGN KEY (abteilung, krankenhaus) REFERENCES Abteilung(abid, krankenhaus) DEFERRABLE INITIALLY DEFERRED;

COMMIT;

Что я делаю неправильно?

После добавления столбца krankenhaus в таблицу mitarbeiter и изменения команды alter table я все равно получаю ту же ошибку...


  • Сообщение об ошибке противоречит вашему коду после того, как вы применили совет @a_horse. Он должен работать. Однако вы выбрали худший вариант. Вам лучше удалить лишнее mitarbeiter.krankenhaus и использовать только abid для PK и FK. 28.10.2014

Ответы:


1

Первичный ключ таблицы Abteilung(abid, krankenhaus). Поскольку внешняя ссылка ссылается только на одну строку, вам также необходимо использовать оба столбца в определении ограничения внешнего ключа.

Но поскольку у вас нет столбца krankenhaus в таблице Mitarbeiter, вы не можете ссылаться на Abteilung.

Вам нужно либо уменьшить первичный ключ Abteilung до (abid) (что было бы возможно, поскольку это в любом случае сгенерированный искусственный ключ), либо добавить столбец Krankenhaus в вашу таблицу Mitarbeiter.

27.10.2014
  • О да, спасибо! Но теперь я изменил его, как вы говорите (см. Код), но получаю ту же ошибку. 28.10.2014

  • 2

    Это должно работать:

    CREATE TABLE person (
       svnr text PRIMARY KEY
     , anschrift text NOT NULL
     , name text NOT NULL
    );
    
    CREATE TABLE mitarbeiter (
       svnr text PRIMARY KEY REFERENCES person
     , beschaeftigt_seit date NOT NULL
     , gehalt numeric(5,2)
     , abid int NOT NULL
     , CHECK(gehalt > 0)
    );
    
    CREATE TABLE krankenhaus (
       kid serial PRIMARY KEY
     , anschrift text NOT NULL
     , name text NOT NULL
     , geleitet_von text REFERENCES mitarbeiter(svnr) DEFERRABLE INITIALLY DEFERRED
    );
    
    CREATE TABLE abteilung (
       abid serial PRIMARY KEY
     , kid INTEGER REFERENCES krankenhaus(kid)
     , koordiniert text REFERENCES mitarbeiter(svnr) DEFERRABLE INITIALLY DEFERRED
     , name text NOT NULL
     , anschrift text NOT NULL
    );
    
    ALTER TABLE mitarbeiter
       ADD CONSTRAINT fk_abteilung FOREIGN KEY (abid)
       REFERENCES abteilung(abid) DEFERRABLE INITIALLY DEFERRED;
    

    Используйте столбец serial для суррогатных ПК:

    Не используйте varchar(n) с произвольными ограничениями длины строки, если только вам действительно не необходимо установить максимальную длину и она не изменится. Видеть:

    Используйте только abid в качестве первичного ключа для abteilung. должно быть соответствующее приложение для избыточного столбца, включенного в ограничение FK, но это не то, что делает ваша модель прямо сейчас:

    Нет необходимости использовать явную транзакцию (BEGIN ... COMMIT) для части кода.

    Настоящая трудность с этими циклическими ссылками заключается в вводе и изменении данных. Вы, вероятно, сделали свои ограничения FK DEFERRABLE INITIALLY DEFERRED, что сделает некоторые запросы значительно медленнее.
    Вы можете использовать простые ограничения FK по умолчанию IMMEDIATE, если вы обернете INSERT/UPDATE для связанных строк в изменяющие данные CTE. Видеть:

    28.10.2014
  • Благодарность! Но мне нужна колонна krankenhaus в abteilung и mitarbeiter, потому что abteilung - слабая сущность krankenhaus 28.10.2014
  • @prodi22: Что такое weaky entity? В любом случае, abteilung.kid должно быть все, что вам нужно. 29.10.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..