Проблема с внешними ключами в базе данных SQL - PullRequest
0 голосов
/ 28 сентября 2011

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

CREATE DATABASE GamblingSociety;

USE GamblingSociety;

CREATE TABLE GamblingDen
(
    Name VARCHAR (20) PRIMARY KEY,
    Address VARCHAR (50),
    Phone VARCHAR (10)
);

CREATE TABLE Room (
    RoomNr INT,
    GameCapaity INT,
    GamblingDenName VARCHAR (20),
    PRIMARY KEY (RoomNr, GamblingDenName),
    FOREIGN KEY (GamblingDenName) REFERENCES GamblingDen (Name)
);

CREATE TABLE Employee (
    SSN CHAR (11) PRIMARY KEY,
    Name VARCHAR (20),
    Address VARCHAR(50),
    Salary INT,
    isBoss BOOL,
    GamblingDenName VARCHAR (20),
    FOREIGN KEY (GamblingDenName) REFERENCES GamblingDen (Name)
);

CREATE TABLE GameType (
    Name VARCHAR (20) PRIMARY KEY,
    WinningProcentage FLOAT,
    ResponsibleEmployee CHAR (11),
    FOREIGN KEY (ResponsibleEmployee) REFERENCES Employee (SSN)
);

CREATE TABLE Supplier (
    Name VARCHAR (20) PRIMARY KEY,
    Address VARCHAR (50)
);

CREATE TABLE SupplierOfGameType (
    SupplierName VARCHAR (20),
    GameTypeName VARCHAR (20),
    PRIMARY KEY(SupplierName, GameTypeName),
    FOREIGN KEY (SupplierName) REFERENCES Supplier (Name),
    FOREIGN KEY (GameTypeName) REFERENCES GameType (Name)
);

CREATE TABLE GamblingTable (
    TableNr INT,
    RoomNr INT,
    GamblingDenName VARCHAR (20),
    GameTypeName VARCHAR (20),
    Comments VARCHAR (128),
    PRIMARY KEY (RoomNr, TableNr, GamblingDenName, GameTypeName),
    FOREIGN KEY (RoomNr, GamblingDenName) REFERENCES Room (RoomNr, GamblingDenName),
    FOREIGN KEY (GameTypeName) REFERENCES GameType (Name)
);

CREATE TABLE Shylock (
    Phone CHAR (10) PRIMARY KEY,
    Name VARCHAR (20),
    Contry CHAR (3)
);

CREATE TABLE Customer (
    SSN CHAR (11) PRIMARY KEY,
    Name VARCHAR (20),
    Phone CHAR (10),
    Address VARCHAR (50)
);

Но это последнеезапрос не работает:

USE GamblingSociety;

CREATE TABLE GamblingInstance (
    StartTime DATETIME,
    EndingTime DATETIME,
    GamblingDenName VARCHAR (20),
    TableNr INT, 
    GameTypeName VARCHAR (20), 
    Customer CHAR (11),
    Shylock CHAR (10), 
    Debt INT, 
    DebtPayed BOOL,
    DebtPayedDate DATETIME,
    PRIMARY KEY (StartTime, GameTypeName, Customer),
    FOREIGN KEY (GamblingDenName, TableNr, GameTypeName) REFERENCES GamblingTable (GamblingDenName, TableNr, GameTypeName),
    FOREIGN KEY (Customer) REFERENCES Customer (SSN),
    FOREIGN KEY (Shylock) REFERENCES Shylock (Phone)
);

Это дает мне эту ошибку: «Код ошибки: 1005. Невозможно создать таблицу 'gamblingsociety.gamblinginstance' (errno: 150)"

, если язамените это:

FOREIGN KEY (GamblingDenName, TableNr, GameTypeName) REFERENCES GamblingTable (GamblingDenName, TableNr, GameTypeName),

на это:

FOREIGN KEY (GameTypeName) REFERENCES GamblingTable (GameTypeName),

Это работает, так что это что-то с GamblingDenName и TableNr.

И у меня есть Google и нашелмного советов, но ничто не помогло ...

Так кто-нибудь с какой-либо идеей?

Заранее спасибо!

1 Ответ

0 голосов
/ 28 сентября 2011

В GamblingTable нет ключа, который мог бы удовлетворить эту ССЫЛКУ:

  REFERENCES GamblingTable (GamblingDenName, TableNr, GameTypeName),

То есть, в GamblingTable нет ключа, для которого GamblingDenName, TableNr, GameTypeName являются единственными столбцами или первымтри столбца.

Там - это ключ, который удовлетворяет REFERENCES GamblingTable (GameTypeName), поэтому эта версия работает.

(Я должен сказать, что никогда не виделИНОСТРАННЫЕ КЛЮЧИ используются для родительских ИНОСТРАННЫХ КЛЮЧЕЙ, но я думаю, что это работает).

...