首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#1005 - mysql -无法创建外键

问#1005 - mysql -无法创建外键
EN

Stack Overflow用户
提问于 2016-06-05 18:30:03
回答 2查看 63关注 0票数 1

我在这里创建了这个表:

代码语言:javascript
复制
CREATE TABLE izpulnitel(
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
ime VARCHAR(30) NOT NULL,
familia VARCHAR(30) NOT NULL,
img BLOB
);

另一张桌子:

代码语言:javascript
复制
CREATE TABLE album(
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
godina INT(6) NULL,
opisanie TEXT
);

我想用两个外键做第三张桌子:

代码语言:javascript
复制
CREATE TABLE pesen (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ime VARCHAR(30) NOT NULL,
    tekst TEXT,
    izpulnitel_id INT(6),
    album_id INT(6),

    INDEX par_ind  (izpulnitel_id),
    INDEX par_indx (album_id),

    FOREIGN KEY (izpulnitel_id) 
        REFERENCES izpulnitel(id)
        ON DELETE CASCADE,

    FOREIGN KEY (album_id) 
        REFERENCES album(id)
        ON DELETE CASCADE
)

但由于某些原因,无法创建该表。外键操作符周围有某种错误,很可能是索引标记。

我试着用CREATE INDEX ...添加单独的查询,但似乎不起作用。我应该用父表的创建来创建这些索引,还是有另一个解决方案?这些指数到底是做什么用的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-05 18:42:52

在创建外键时,非常重要的(读:必需)是使用的列具有相同的类型。

来自MySQL文档:

外键和引用键中的对应列必须具有类似的数据类型。整数类型的大小和符号必须相同。字符串类型的长度不一定相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。

前两个表中的id列为INT无符号,但第三个表中的izpulnitel_id和album_id为INT(即签名)。签名是必须匹配的事情之一。将这些列更改为INT(6)未签名,您应该已经上路了。

这些索引是出于性能原因而存在的。同样来自MySQL文档:

MySQL需要对外键和引用键进行索引,这样外键检查就可以快速而不需要表扫描。

票数 2
EN

Stack Overflow用户

发布于 2016-06-05 18:56:10

代码语言:javascript
复制
CREATE TABLE pesen ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, ime VARCHAR(30) NOT NULL, tekst TEXT, izpulnitel_id INT(6) UNSIGNED, album_id INT(6) UNSIGNED, INDEX par_ind (izpulnitel_id), INDEX par_indx (album_id), FOREIGN KEY (izpulnitel_id) REFERENCES izpulnitel(id) ON DELETE CASCADE, FOREIGN KEY (album_id) REFERENCES album(id) ON DELETE CASCADE )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37645365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档