在sql中实际构建表时是否需要使用约束?

时间:2016-11-21 19:43:45

标签: mysql sql

我正在尝试在创建表时添加约束。是否有必要,格式是什么?

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)
);

1 个答案:

答案 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手册页。

EDIT1

在评论中帮助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