2011-09-27 68 views
0

我有一所学校的作业,这是给我和我的朋友们头痛......所以这是我的查询,我已执行,一次一个OFC ...问题在SQL数据库外键

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。

和我有谷歌了一下,发现了很多技巧,但没有yeat工作过......

有任何想法,因此,任何人?

在此先感谢!

+1

请问您的代码真的有两个'FORIEGN KEY'条款,以'GamblingTable'在同一时间? – mellamokb

+0

哦,只是看到现在......第一行不应该有...只是一个错字 – Mockarutan

回答

0

有一个在GamblingTable没有钥匙能够满足这个参考:

REFERENCES GamblingTable (GamblingDenName, TableNr, GameTypeName), 

也就是说,存在GamblingTable针对GamblingDenName, TableNr, GameTypeName是唯一的列,或者前三栏没有钥匙。

There is一个满足REFERENCES GamblingTable (GameTypeName)的密钥,这就是该版本工作的原因。

(我不得不说,我从来没有真正看到被用来父其它外键外键,但我想它的工作原理)。

+0

嗯..因此,换句话说,如果'PRIMARY KEY'被安排在这样一种方式,前三它会工作列相匹配的外键引用,即'PRIMARY KEY(GamblingDenName,TableNr,GameTypeName,RoomNr)'? – mellamokb

+0

是的,该*应该*工作。在某个地方有一个数据库,需要进行某种设置更改以允许这样的部分键引用,它可能是MySQL。 –

+0

但需要注意的是,对于加快搜索的目的,你必须包含在索引中的可转位比较,列先从最左边的列。所以,如果你在主键排序的列目的是速度房间号搜索将不会与不同地布置PRIMARY KEY发生了。 –