Ошибочный внешний ключ, имеющий много значений на одно значение первичного ключа? - PullRequest
1 голос
/ 08 мая 2019

Я заново изучаю первичные и внешние ключи из примера на Source Daddy о различных производителях различных игрушек:

CREATE TABLE Manufacturers
(
    ManufacturerID INTEGER CONSTRAINT ManfID PRIMARY KEY,
    ToyID INTEGER NOT NULL,
    CompanyName CHAR(50) NOT NULL,
    Address CHAR(50) NOT NULL,
    City CHAR(20) NOT NULL,
    State CHAR(2) NOT NULL,
    PostalCode CHAR(5) NOT NULL,
    AreaCode CHAR(3) NOT NULL,
    PhoneNumber CHAR(8) NOT NULL UNIQUE,

    CONSTRAINT ToyFk 
        FOREIGN KEY (ToyID) REFERENCES Toys (ToyID)
                ON UPDATE CASCADE
                ON DELETE CASCADE
);

Хотя я не часто пользуюсь ключами, думаю, я их понимаю. Я озадачен приведенным выше примером. Это стол производителя и есть еще один стол игрушек. Можно ожидать сопоставления множества игрушек с любым производителем. Таким образом, не имеет смысла иметь поле Toy ID в таблице производителей, если только для какой-либо конкретной записи производителя это поле не должно содержать коллекцию Toy ID.

Конечно, вы можете использовать строку для этого [1], но цель этого примера, похоже, не в том, чтобы путать вещи со странными экзотическими примерами.

Неужели я все эти годы неправильно понимал? Если да, может кто-нибудь объяснить эту проблему?

Спасибо.

P.S. Если я прав, то ошибка полностью смущает следующую страницу 1015 *, которая пытается описать направление обновлений, вытекающих из CASCADE.

[1] Или сделайте это в Matlab, который допускает сложные ячейки.

1 Ответ

1 голос
/ 09 мая 2019

Суть проблемы игрушек (простите за каламбур) заключается в том, чтобы иметь интуитивную и простую семантику, но такой конструкции нет, поэтому это плохой и запутанный пример.

SQL PK (первичный ключ)) - это некоторый УНИКАЛЬНЫЙ набор столбцов NOT NULL, который вы выбрали для вызова PK.SQL FK (внешний ключ) - это список столбцов, чьи подстроки появляются в других местах как объявленные UNIQUE (возможно, PK).Объявите PK, UNIQUE NOT NULL, UNIQUE & FKs, как они возникают, если это не подразумевается другими декларациями.Кроме того, объявленный FK должен быть объявлен UNIQUE / PK, поэтому вы должны объявить такой UNIQUE / PK, даже если это подразумевается другими декларациями.DMBS может использовать PK для дальнейших целей.

...