sql数据库中的外键问题

时间:2011-09-27 21:49:31

标签: mysql sql foreign-keys mysql-error-1005

我有一个学校作业,这让我和我的朋友头疼......所以这是我执行的查询,一次一个...

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'(错误号:150)”

如果我替换它:

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

用这个:

FOREIGN KEY (GameTypeName) REFERENCES GamblingTable (GameTypeName),

它有效,所以它与GamblingDenName和TableNr有关。

我已经google了,发现了很多提示,但是没有任何东西可以工作......

所有有想法的人?

提前致谢!

1 个答案:

答案 0 :(得分:0)

GamblingTable中没有可以满足此参考的键:

  REFERENCES GamblingTable (GamblingDenName, TableNr, GameTypeName),

也就是说,GamblingTable中没有GamblingDenName, TableNr, GameTypeName唯一的列或前三列。

满足REFERENCES GamblingTable (GameTypeName)的密钥,这就是该版本有效的原因。

(我必须说我从来没有真正看到FOREIGN KEY被用来为其他FOREIGN KEY做父母,但我猜它有用)。