菜鸟求教。
例如我现在想设计一个订单的数据库,其中一个表为“订单”,另一个表为“地址”。
“订单”表中有2个字段分别为“发件地址id”和“收件地址id”,我现在想将这2个字段设置外键同时与“地址”表中的“地址id”这个字段关联。请问可以做到么?sql语句怎么编写?想达到的效果是:“订单”表中的“发件地址id”和“收件地址id”这两个字段的内容,都必须是“地址”表中“地址id”这个字段里已经有的内容。且假设当我删除“地址”表中“地址id”为1的某条记录时,“订单”表中无论是“发件地址id”还是“收件地址id”,只要包含id为1这个信息的所有相关记录都会级联删除。

解决方案 »

  1.   

    在MYSQL中对外键提供了有限的支持,目前只有InnoDB引擎支持外键,它要求所有关联表都必须是InnoDB型,而且不能是临时表,同时只支持表级约束实现,其定义语法如下:
    [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 ;
      

  2.   

    create table 订单(
      orderid int primary key,
     ..
      发件地址id int,
      收件地址id int,
      CONSTRAINT x1 FOREIGN KEY(发件地址id) REFERENCES 地址(地址id),
      CONSTRAINT x2 FOREIGN KEY(收件地址id) REFERENCES 地址(地址id)
    )
      

  3.   

    谢谢你的回复,这样做确实可以,但我现在还想添加一个主键是“国家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”项。