我正在尝试在创建表时添加约束。是否有必要,格式是什么?
CREATE TABLE ORDER (
OrderNumber Int AUTO_INCREMENT NOT NULL,
CustomerID Int NOT NULL,
ItemID Char(25) NOT NULL,
CONSTRAINT OrderPK PRIMARY KEY(OrderNumber),
CONSTRAINT OrderFK FOREIGN KEY(CustomerID)
REFERENCES CUSTOMER(CustomerID),
CONSTRAINT OrderFK FOREIGN KEY(ItemID)
REFERENCES ITEM(ItemID)
);
答案 0 :(得分:1)
在添加数据之前使用约束作为表创建的一部分是一个明智的想法,并在以后尝试添加此类约束时遇到问题。事后添加的约束需要通过ALTER TABLE
用法发生。
ALTER TABLE
之后的问题是,数据通常可能不符合您希望的参照完整性。因此,在清理数据之前,不能添加这些约束。
以下是设置FK的两个表的示例:
我输入:
CREATE TABLE `users`
( `userId` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL
)ENGINE=InnoDB;
CREATE TABLE `accounts`
( `acctId` INT AUTO_INCREMENT PRIMARY KEY,
`userId` INT NOT NULL,
`acctType` CHAR(5) NOT NULL,
CONSTRAINT `c_acct_2_user` FOREIGN KEY (`userId`) REFERENCES `users`(`userId`)
)ENGINE=InnoDB;
服务器将其解释为:
CREATE TABLE `users` (
`userId` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `accounts` (
`acctId` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) NOT NULL,
`acctType` char(5) NOT NULL,
PRIMARY KEY (`acctId`),
KEY `c_acct_2_user` (`userId`),
CONSTRAINT `c_acct_2_user` FOREIGN KEY (`userId`) REFERENCES `users` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上述行
KEY `c_acct_2_user` (`userId`),
是从引用到引用的创建帮助密钥的服务器。通常不需要为您制作这些辅助键,具体取决于您在表中可用的其他键。
请参阅名为Using FOREIGN KEY Constraints的MySQL手册页。
在评论中帮助OP:
CREATE SCHEMA testMonday07;
USE testMonday07;
CREATE TABLE `CUSTOMER`
( `CustomerID` INT AUTO_INCREMENT PRIMARY KEY
-- other columns etc
);
CREATE TABLE `ITEM`
( `ItemID` CHAR(25) PRIMARY KEY
-- other columns etc
);
CREATE TABLE `ORDER`
( -- literally your table name. Awful name for a table as it is a Reserved Word
`OrderNumber` INT AUTO_INCREMENT PRIMARY KEY,
`CustomerID` INT NOT NULL,
`ItemID` CHAR(25) NOT NULL,
CONSTRAINT `some_name_1` FOREIGN KEY (`CustomerID`) REFERENCES `CUSTOMER`(`CustomerID`),
CONSTRAINT `sdome_name_2` FOREIGN KEY (`ItemID`) REFERENCES `ITEM`(`ItemID`)
);
DROP SCHEMA testMonday07; -- clean up, poof, all gone