【问题标题】:Unable to fix a syntax error in mysql while trying to create a table尝试创建表时无法修复 mysql 中的语法错误
【发布时间】:2019-11-30 02:03:12
【问题描述】:
CREATE TABLE category(
  id int(10) NOT NULL AUTO_INCREMENT,
  entity_type varchar(32),
  entity_id INT(10),
  PRIMARY KEY (id),
  FOREIGN KEY (entity_id)
)

我收到一个错误

您的 SQL 语法有错误;似乎错误就在附近:' entity_id INT(10),主键(id),外键(entity_id))'在 第 3 行

我无法理解如何解决它。

而当我添加这个时

CREATE TABLE `Image` (
  `Id [PK]` int (10)                               ,
  `EntityType` varchar(32),
  `EntityId [FK]` int(10)
);

上面的代码修复了错误

下面是给出外键约束的代码,即使我尝试先创建图像和类别表,然后在用户表中添加与它的关系

$sql_image = 'CREATE TABLE IF NOT EXISTS image (
    id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    entity_type VARCHAR(32) NOT NULL,
    entity_id INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY (id) )';

if ($db->database->createTable($sql_image)) {   echo "Image Table Created Successfully"; }

$sql_category = 'CREATE TABLE IF NOT EXISTS category (
    id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    entity_type VARCHAR(32) NOT NULL,
    entity_id INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY (id) );';

if ($db->database->createTable($sql_category)) {
    echo "Category Table Created Successfully"; }

$sql_user = 'Create TABLE IF NOT EXISTS user(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    first_name varchar(255),
    last_name varchar(255),
    email varchar(255),
    category int(10),
    status boolean,
    user_profile_photo int(10),
    FOREIGN KEY (user_profile_photo) references image(entity_id),
    FOREIGN KEY (category) references category(entity_id) );';

if ($db->database->createTable($sql_user)) {
    echo "User Table Created Successfully"; }

【问题讨论】:

  • FOREIGN KEY (entity_id) REFERENCES Entity (id),这里Entity是关系表名,(id)是关系表中的列。
  • 如果你去掉', FOREIGN KEY (entity_id)',它会起作用吗?
  • @Strawberry 是的,它可以在没有外键的情况下工作
  • 如有疑问请阅读手册dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html。顺便说一句,外键只能引用 1 个表。

标签: php mysql create-table


【解决方案1】:

最后一行写错了。 试试这样的:

FOREIGN KEY (product_category, product_id)
      REFERENCES product(category, id)'
FOREIGN KEY (product_category, product_id)
      REFERENCES second_table(category, id)

【讨论】:

  • 我有两个表 user 和 blog 引用 entity_id 如何使用多个引用
  • @harshal,您只需写入外键行并在第二行更改表。看我的帖子,我编辑了它
  • 我收到上述错误:#1215 - 无法添加外键约束
  • 可能因为没有创建表用户和博客
  • 不,它也不适用于一个外键,因此可能需要先添加表,然后创建另一个具有此外键约束的表
【解决方案2】:

如果要添加外键,则需要定义引用表意味着entity_id 属于哪个表

CREATE TABLE category(
  id int(10) NOT NULL AUTO_INCREMENT,
  entity_type varchar(32),
  entity_id INT(10),
  PRIMARY KEY (id),
  FOREIGN KEY (entity_id) REFERENCES Entity(entity_id)
)

【讨论】:

    【解决方案3】:

    我可以看到的 2 个错误 1) 'MySQL 需要外键和引用键的索引'。如果您不这样做,MySQL 将在引用表(用户)上创建键,但您必须在 entity_id(图像,类别)上的引用表上创建它们 2) '外键和被引用键中的对应列必须具有相似的数据类型。整数类型的大小和符号必须相同'

    https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html

    这个语法并生成表格(你需要决定 k1 和 k2 应该是什么类型的键):-

    drop table if exists us;
    drop table if exists i;
    drop table if exists c;
    
    CREATE TABLE IF NOT EXISTS i (
        id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
        entity_type VARCHAR(32) NOT NULL,
        entity_id INT(10) UNSIGNED NOT NULL,
        PRIMARY KEY (id) );
    alter table i
        add key k1(entity_id);
    
    CREATE TABLE IF NOT EXISTS c (
        id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
        entity_type VARCHAR(32) NOT NULL,
        entity_id INT(10) UNSIGNED NOT NULL,
        PRIMARY KEY (id) );
    alter table c
        add key k2(entity_id);
    
    Create TABLE IF NOT EXISTS us(
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        first_name varchar(255),
        last_name varchar(255),
        email varchar(255),
        category int(10) unsigned,
        status boolean,
        user_profile_photo int(10) unsigned,
        FOREIGN KEY fk1(user_profile_photo) references i(entity_id),
        FOREIGN KEY (category) references c(entity_id) 
        );
    

    【讨论】:

      【解决方案4】:
      1. 验证两个表列是否定义为相同的数据类型。
      2. 验证表及其列是否具有相同的排序规则字符集应该相同,例如UTF-8
        • 即使表具有相同的排序规则,列仍可能具有不同的排序规则。
      3. 验证两列是否具有相同的签名定义。如果引用列是 int(10) 无符号的,那么引用列应该是 列。

      就我而言 用户表中的 user_profile_photo 列和图像表中的 id 具有不同的签名定义。因此它没有添加外键。 FOREIGN KEY (user_profile_photo) 引用图片(id), FOREIGN KEY(类别)引用类别(id)

      $sql_image = 'CREATE TABLE IF NOT EXISTS image (
          id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, // int(10) UNSIGNED should be same as that in user table below.
          entity_type VARCHAR(32) NOT NULL,
          PRIMARY KEY (id)
      )';
      
      if ($db->database->createTable($sql_image)) {
        echo "Image Table Created Successfully<br><br>";
      }
      
      $sql_category = 'CREATE TABLE IF NOT EXISTS category (
          id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, // int(10) UNSIGNED should be same as that in user table below.
          entity_type VARCHAR(32) NOT NULL,
          PRIMARY KEY (id)
      );';
      
      if ($db->database->createTable($sql_category)) {
          echo "Category Table Created Successfully<br><br>";
      }
      
      $sql_user = 'CREATE TABLE IF NOT EXISTS user(
          id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
          first_name varchar(255),
          last_name varchar(255),
          email varchar(255),
          category int(10) UNSIGNED NOT NULL, //int(10) UNSIGNED should be match id from category table.
          status boolean,
          user_profile_photo int(10) UNSIGNED NOT NULL,
          FOREIGN KEY (user_profile_photo) references image(id),
          FOREIGN KEY (category) references category(id)
      );';
      
      if ($db->database->createTable($sql_user)) {
          echo "User Table Created Successfully<br><br>";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-14
        • 2023-01-30
        • 2019-09-07
        • 2014-04-09
        • 2016-02-07
        • 2014-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多