将唯一键作为外键?

Mas*_*hah 3 mysql mysql-5.5

您好,我想将唯一键作为外键,但出现错误,我已经检查过这个问题

我的会员表

 CREATE TABLE IF NOT EXISTS `member` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `email` varchar(100) NOT NULL,
  `contact` varchar(100) NOT NULL,
  `facebook` varchar(100) NOT NULL,
  `cnic` varchar(100) NOT NULL,
  `expertise` varchar(100) NOT NULL,
  `com_code` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)

和我的个人资料图片表

create table profileimage(
imageid int primary key not null,
username varchar(100) foreign key references member(username) 
ON DELETE CASCADE
 ON UPDATE CASCADE,
imagepath varchar(255) not null
);
Run Code Online (Sandbox Code Playgroud)

我遇到的错误 #1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,在第 6 行的“外键引用成员(用户名)ON DELETE CASCADE ON UPDATE CASCADE”附近使用正确的语法

ype*_*eᵀᴹ 6

是的,您可以有一个FOREIGN KEY约束来引用具有约束的列UNIQUE

您得到的语法错误是因为您没有为该列提供数据类型。它应该与引用列的类型相同:username varchar(50)

另一个问题是外部约束的语法。如果您将它们“内联”,即紧跟在列定义之后,您将跳过FOREIGN KEY并且只有REFERENCES

-- Don't do this in MySQL !!!!
CREATE TABLE profileimage
( imageid int  NOT NULL PRIMARY KEY,
  username varchar(50)
     REFERENCES member (username) 
     ON DELETE CASCADE
     ON UPDATE CASCADE,
  imagepath varchar(255) NOT NULL
) ENGINE=InnoDB ;
Run Code Online (Sandbox Code Playgroud)

或者你把它们分开,用FOREIGN KEY关键字:

-- Do this in MySQL
CREATE TABLE profileimage
( imageid int NOT NULL PRIMARY KEY,
  username varchar(50),
  imagepath varchar(255) NOT NULL,
  FOREIGN KEY (username)
     REFERENCES member (username) 
     ON DELETE CASCADE
     ON UPDATE CASCADE
) ENGINE=InnoDB ;
Run Code Online (Sandbox Code Playgroud)

大惊喜:这两种语法都可以在 MySQL 中使用,但有一个问题:第一种语法被解析为语法有效性(并且它通过),但没有创建外键!(你收到警告)

第二种语法工作正常。