菜鸟求教。
例如我现在想设计一个订单的数据库,其中一个表为“订单”,另一个表为“地址”。
“订单”表中有2个字段分别为“发件地址id”和“收件地址id”,我现在想将这2个字段设置外键同时与“地址”表中的“地址id”这个字段关联。请问可以做到么?sql语句怎么编写?想达到的效果是:“订单”表中的“发件地址id”和“收件地址id”这两个字段的内容,都必须是“地址”表中“地址id”这个字段里已经有的内容。且假设当我删除“地址”表中“地址id”为1的某条记录时,“订单”表中无论是“发件地址id”还是“收件地址id”,只要包含id为1这个信息的所有相关记录都会级联删除。
例如我现在想设计一个订单的数据库,其中一个表为“订单”,另一个表为“地址”。
“订单”表中有2个字段分别为“发件地址id”和“收件地址id”,我现在想将这2个字段设置外键同时与“地址”表中的“地址id”这个字段关联。请问可以做到么?sql语句怎么编写?想达到的效果是:“订单”表中的“发件地址id”和“收件地址id”这两个字段的内容,都必须是“地址”表中“地址id”这个字段里已经有的内容。且假设当我删除“地址”表中“地址id”为1的某条记录时,“订单”表中无论是“发件地址id”还是“收件地址id”,只要包含id为1这个信息的所有相关记录都会级联删除。
[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...) /* 外键列 */
REFERENCES tbl_name (index_col_name,...) /* 引用列 */
[ON DELETE reference_option] /*删除时的关联操作方式*/
[ON UPDATE reference_option] /*修改时的关联操作方式*/reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION /*限制 |级联 | 设空 | 无*/给个示例:
CREATE TABLE user(
uid INT NOT NULL PRIMARY KEY
) ENGINE=innodb ;
CREATE TABLE topic(
tid INT NOT NULL PRIMARY KEY,
uid INT NOT NULL ,
FOREIGN KEY(uid) REFERENCES user(uid) /*表级约束,如果需要设定是删除级联,可以写成 ON DELETE CASCADE,如果是两个外键,把这条语句重复一次,注意更换外键列*/
)ENGINE=innodb ;
orderid int primary key,
..
发件地址id int,
收件地址id int,
CONSTRAINT x1 FOREIGN KEY(发件地址id) REFERENCES 地址(地址id),
CONSTRAINT x2 FOREIGN KEY(收件地址id) REFERENCES 地址(地址id)
)
其中国家表是这样的CREATE TABLE `国家` (
`国家id` int(11) NOT NULL,
`国家名称` varchar(45) NOT NULL,
PRIMARY KEY (`国家id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$地址表是这样的CREATE TABLE `地址` (
`地址id` int(11) NOT NULL,
`名称` varchar(45) NOT NULL,
`国家id` int(11) NOT NULL,
PRIMARY KEY (`地址id`,`国家id`),
KEY `aa` (`国家id`),
CONSTRAINT `aa` FOREIGN KEY (`国家id`) REFERENCES `国家` (`国家id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$订单表是这样的CREATE TABLE `订单` (
`no` int(11) NOT NULL,
`发件地址id` int(11) NOT NULL,
`收件地址id` int(11) NOT NULL,
`国家id` int(11) NOT NULL,
PRIMARY KEY (`no`,`国家id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$请问我应该如何设置订单表的外键,使得订单表中的“国家id”,“发件地址id”和“收件地址id”都与地址表中的对应项目关联?其中“发件地址id”和“收件地址id”都关联“地址id”项,“国家id”关联“国家id”项。