2011-06-13 138 views
0

有誰知道以下SQL查詢有什麼問題嗎?SQL語法錯誤?

CREATE TABLE IF NOT EXISTS PrWorlds (     # World table 
worldid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
worldname VARCHAR(32) NOT NULL UNIQUE     # Name of world 
); 

CREATE TABLE IF NOT EXISTS PrEntries (     # User/Group table 
entryid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
name VARCHAR(32) NOT NULL,        # Name of user/group 
worldid INTEGER NOT NULL,        # ID of the world the  user/group belongs to 
type TINYINT NOT NULL,         # Type denotes the entry type.  0 for a user, 1 for a group 
CONSTRAINT NameWorld UNIQUE (name, worldid, type), 
ENTRYINDEX 
FOREIGN KEY(worldid) REFERENCES PrWorlds(worldid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS PrPermissions (       # Table of  permission nodes 
permid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
permstring VARCHAR(64) NOT NULL,          # Permission node 
entryid INTEGER NOT NULL,            # Entry whom this  node belongs to 
CONSTRAINT PrEntryPerm UNIQUE (entryid, permstring), 
FOREIGN KEY(entryid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS PrInheritance (     # Table of parent-child  relationships 
uinheritid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
childid INTEGER NOT NULL,         # Child entry 
parentid INTEGER NOT NULL,         # Parent entry 
parentorder INTEGER NOT NULL,        # Denotes order of  inheritance. 
                  # Groups override other  groups' permissions/data 
                  # below them in the results 
CONSTRAINT PrParent UNIQUE (childid, parentid), 
CONSTRAINT PrOrderedInheritance UNIQUE (childid, parentorder), 
CONSTRAINT PrNoSelfInherit CHECK (childid <> parentid), 
FOREIGN KEY(childid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY(parentid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS PrWorldBase (  # Table of the default groups in that world 
worldid INTEGER NOT NULL, 
defaultid INTEGER,       # Default group 
FOREIGN KEY(worldid) REFERENCES PrWorlds(worldid) ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY(defaultid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS PrData (
dataid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
entryid INTEGER NOT NULL ,     # ID entry whom this data node belongs to 
path VARCHAR(64) NOT NULL,     # Path to data node (e.g. "prefix", "build") 
data VARCHAR(64) NOT NULL,     # Data node in string form (o.toString()) 
CONSTRAINT PrDataUnique UNIQUE (entryid, path), 
FOREIGN KEY(entryid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS PrTracks (
trackid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
trackname VARCHAR(64) NOT NULL UNIQUE,      # Track name 
worldid INTEGER NOT NULL,         # ID of world track belongs    to 
    CONSTRAINT TracksUnique UNIQUE (trackid, worldid), 
FOREIGN KEY(worldid) REFERENCES PrWorlds(worldid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS PrTrackGroups (
trackgroupid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
trackid INTEGER NOT NULL,           # ID of track 
gid INTEGER NOT NULL,            # ID of group in  track 
groupOrder INTEGER NOT NULL,          # Denotes position of  the group in the track 
CONSTRAINT TrackGroupsUnique UNIQUE (trackid, gid), 
FOREIGN KEY(trackid) REFERENCES PrTracks(trackid) ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY(gid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

它拋出時,在phpMyAdmin的最新版本上運行這個錯誤:運行通過yum最新的MySQL服務器

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOREIGN KEY(worldid) REFERENCES PrWorlds(worldid) ON DELETE CASCADE ON UPDATE CA' at line 8 

,PHP版本是5.3的PHP MySQL的通過yum添加。
所有這些都在CentOS 5.5 64位上運行。

+0

的錯誤是在'ENTRYINDEX'。 – 2011-06-13 10:30:42

+0

第7行ENTRYINDEX是什麼? – patapizza 2011-06-13 10:30:48

回答

3

刪除ENTRYINDEX並將AUTOINCREMENT更改爲AUTO_INCREMENT

正確的代碼會是這樣:

CREATE TABLE IF NOT EXISTS PrWorlds (     # World table 
worldid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
worldname VARCHAR(32) NOT NULL UNIQUE     # Name of world 
); 

CREATE TABLE IF NOT EXISTS PrEntries (     # User/Group table 
entryid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
name VARCHAR(32) NOT NULL,        # Name of user/group 
worldid INTEGER NOT NULL,        # ID of the world the  user/group belongs to 
type TINYINT NOT NULL,         # Type denotes the entry type.  0 for a user, 1 for a group 
CONSTRAINT NameWorld UNIQUE (name, worldid, type), 
FOREIGN KEY(worldid) REFERENCES PrWorlds(worldid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS PrPermissions (       # Table of  permission nodes 
permid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
permstring VARCHAR(64) NOT NULL,          # Permission node 
entryid INTEGER NOT NULL,            # Entry whom this  node belongs to 
CONSTRAINT PrEntryPerm UNIQUE (entryid, permstring), 
FOREIGN KEY(entryid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE 
); 


CREATE TABLE IF NOT EXISTS PrInheritance (     # Table of parent-child  relationships 
uinheritid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
childid INTEGER NOT NULL,         # Child entry 
parentid INTEGER NOT NULL,         # Parent entry 
parentorder INTEGER NOT NULL,        # Denotes order of  inheritance. 
                  # Groups override other  groups' permissions/data 
                  # below them in the results 
CONSTRAINT PrParent UNIQUE (childid, parentid), 
CONSTRAINT PrOrderedInheritance UNIQUE (childid, parentorder), 
CONSTRAINT PrNoSelfInherit CHECK (childid <> parentid), 
FOREIGN KEY(childid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY(parentid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS PrWorldBase (  # Table of the default groups in that world 
worldid INTEGER NOT NULL, 
defaultid INTEGER,       # Default group 
FOREIGN KEY(worldid) REFERENCES PrWorlds(worldid) ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY(defaultid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS PrData (
dataid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
entryid INTEGER NOT NULL ,     # ID entry whom this data node belongs to 
path VARCHAR(64) NOT NULL,     # Path to data node (e.g. "prefix", "build") 
data VARCHAR(64) NOT NULL,     # Data node in string form (o.toString()) 
CONSTRAINT PrDataUnique UNIQUE (entryid, path), 
FOREIGN KEY(entryid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS PrTracks (
trackid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
trackname VARCHAR(64) NOT NULL UNIQUE,      # Track name 
worldid INTEGER NOT NULL,         # ID of world track belongs    to 
    CONSTRAINT TracksUnique UNIQUE (trackid, worldid), 
FOREIGN KEY(worldid) REFERENCES PrWorlds(worldid) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS PrTrackGroups (
trackgroupid INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
trackid INTEGER NOT NULL,           # ID of track 
gid INTEGER NOT NULL,            # ID of group in  track 
groupOrder INTEGER NOT NULL,          # Denotes position of  the group in the track 
CONSTRAINT TrackGroupsUnique UNIQUE (trackid, gid), 
FOREIGN KEY(trackid) REFERENCES PrTracks(trackid) ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY(gid) REFERENCES PrEntries(entryid) ON DELETE CASCADE ON UPDATE CASCADE 
); 
0

難道數據庫上的默認表類型是MyISAM或其他? FOREIGN KEYINNODB支持,但SQL不指定要使用的表類型。