创建外键时出错(检查数据类型)

Str*_*ger 1 mysql

我正在尝试在两个表之间创建关系.这是每个表和外键创建的查询,

CREATE TABLE IF NOT EXISTS `quotes` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `quote` text COLLATE utf8_unicode_ci NOT NULL,
  `author` int(11) NOT NULL,
  `topic` int(11) NOT NULL,
  `language` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  KEY `author` (`author`),
  KEY `topic` (`topic`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE IF NOT EXISTS `authors` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `author` int(11) NOT NULL,
  `period` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `photo` text COLLATE utf8_unicode_ci NOT NULL,
  `references` text COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  KEY `author` (`author`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

ALTER TABLE `quotes` ADD FOREIGN KEY ( `author` ) REFERENCES `mytestdb`.`authors` (
`id`
) ON DELETE RESTRICT ON UPDATE RESTRICT ;
Run Code Online (Sandbox Code Playgroud)

但它抛出以下错误,

Error creating foreign key on author (check data types)
Run Code Online (Sandbox Code Playgroud)

我不确定这个错误是什么.任何有关这方面的帮助将不胜感激.

Dre*_*rew 7

数据类型和符号必须相同

int 是不一样的 unsigned int

显示宽度无关紧要


author 是一个签名的int

id 是一个unsigned int

手册页:

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

它们具有相同的大小(int).它们没有相同的标志.

显示宽度10和11无关紧要.

演示

create table referenced
(   id int(11) primary key
);

create table referencing
(   id int primary key,
    author int(10) not null,
    CONSTRAINT fk_blah FOREIGN KEY (author) REFERENCES referenced(id)
);
Run Code Online (Sandbox Code Playgroud)

没问题

CREATE TABLE IF NOT EXISTS `quotes` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `quote` text COLLATE utf8_unicode_ci NOT NULL,
  `author` int(11) NOT NULL,
  `topic` int(11) NOT NULL,
  `language` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  KEY `author` (`author`),
  KEY `topic` (`topic`)
) ENGINE=InnoDB;


CREATE TABLE IF NOT EXISTS `authors` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `author` int(11) NOT NULL,
  `period` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `photo` text COLLATE utf8_unicode_ci NOT NULL,
  `references` text COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  KEY `author` (`author`),
  CONSTRAINT fk_blah222 FOREIGN KEY (author) REFERENCES quotes(id)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

没问题

  • 这里有三件让人困惑的事情.只有2个是相关的.相关的2是大小和标志.第3个(irrelvant)的显示宽度为10和11. (2认同)