Mysql Wordpress使用外键创建数据库

Mysql Wordpress使用外键创建数据库,mysql,wordpress,Mysql,Wordpress,我正在尝试创建一个wordpress插件,该插件将使用两个数据库,我需要它们具有外键,但无法让插件创建它们,只有当我删除外键时,我才能让它们创建一个表 global $wpdb; $table_name = $wpdb->prefix . 'aa_accessform'; $table_name2 = $wpdb->prefix . 'aa_formcomments'; $charset_collate = $wpdb->get_charset_collate()

我正在尝试创建一个wordpress插件,该插件将使用两个数据库,我需要它们具有外键,但无法让插件创建它们,只有当我删除外键时,我才能让它们创建一个表

global $wpdb;
  $table_name = $wpdb->prefix . 'aa_accessform';
  $table_name2 = $wpdb->prefix . 'aa_formcomments';

  $charset_collate = $wpdb->get_charset_collate();

    $wpdb->query(
        "CREATE TABLE IF NOT EXISTS $table_name (
            id              INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
            customer_id     INT UNSIGNED NOT NULL,
            appointment_id  INT UNSIGNED NOT NULL,
            notes TEXT,
            token VARCHAR(255) DEFAULT NULL
        ) ENGINE = INNODB
        DEFAULT CHARACTER SET = utf8
        COLLATE = utf8_general_ci"
    );
    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
    $wpdb->query(
        "CREATE TABLE IF NOT EXISTS $table_name2 (
            id              INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
            customer_codes__id     INT UNSIGNED NOT NULL,
            appointment_codes_id  INT UNSIGNED NOT NULL,
            notes TEXT,
            token VARCHAR(255) DEFAULT NULL,
            PRIMARY KEY  (id),
            FOREIGN KEY  (customer_codes__id) REFERENCES ".$table_name." (id)
        ) ENGINE = INNODB
        DEFAULT CHARACTER SET = utf8
        COLLATE = utf8_general_ci"
    );
    dbDelta( $sql );

我很想知道问题出在哪里。

我找到了答案,现在正在进行以下工作

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

  global $wpdb;
  $table_name = $wpdb->prefix . 'aa_accessform';
  $table_name2 = $wpdb->prefix . 'aa_formcomments';


    $wpdb->query(
    "CREATE TABLE IF NOT EXISTS $table_name (
        id              INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        customer_id     INT UNSIGNED NOT NULL,
        appointment_id  INT UNSIGNED NOT NULL,
        notes TEXT,
        token VARCHAR(255) DEFAULT NULL
    ) ENGINE = INNODB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci"
);

dbDelta();

$wpdb->query(
    "CREATE TABLE IF NOT EXISTS $table_name2 (
        id              INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        customer_codes_id     INT UNSIGNED NOT NULL,
        appointment_codes_id  INT UNSIGNED NOT NULL,
        notes TEXT,
        token VARCHAR(255) DEFAULT NULL,
        FOREIGN KEY  (customer_codes_id) REFERENCES $table_name(id)
    ) ENGINE = INNODB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci"
);

dbDelta();
请注意,下面的一行是真正的修复 外键(客户代码)引用$table\u name(id)//正确 下面的错误行是:
外键(客户代码)引用“$table\u name.”(id)//错误

我找到了答案,现在正在进行以下工作

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

  global $wpdb;
  $table_name = $wpdb->prefix . 'aa_accessform';
  $table_name2 = $wpdb->prefix . 'aa_formcomments';


    $wpdb->query(
    "CREATE TABLE IF NOT EXISTS $table_name (
        id              INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        customer_id     INT UNSIGNED NOT NULL,
        appointment_id  INT UNSIGNED NOT NULL,
        notes TEXT,
        token VARCHAR(255) DEFAULT NULL
    ) ENGINE = INNODB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci"
);

dbDelta();

$wpdb->query(
    "CREATE TABLE IF NOT EXISTS $table_name2 (
        id              INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        customer_codes_id     INT UNSIGNED NOT NULL,
        appointment_codes_id  INT UNSIGNED NOT NULL,
        notes TEXT,
        token VARCHAR(255) DEFAULT NULL,
        FOREIGN KEY  (customer_codes_id) REFERENCES $table_name(id)
    ) ENGINE = INNODB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci"
);

dbDelta();
请注意,下面的一行是真正的修复 外键(客户代码)引用$table\u name(id)//正确 下面的错误行是:
外键(客户代码id)引用“$table\u name.”(id)//错误

如果删除引号,会有任何更改。
。引用$table\u name(id)…
定义看起来正确。您是否尝试在PHP上下文之外使用普通MySQL客户端创建它们?如果第一个表没有成功创建,或者已经存在不同的定义,那么第二个表将失败。在SQLFIDLE中创建表,()我确实遇到了“定义了多个主键”,因为在
$table\u name2
中的
id
定义中都有
主键,然后在
外键定义之前重复。删除
主键(id)
有效,但与您必须删除FK不一致。无论如何,您都应该在这两条语句之后检查错误,以找出MySQL报告的错误。@mihai在我删除“”时仍然保持不变。。它不生成第二个表,只生成第一个表。@MichaelBerkowski您的代码在mysql内部工作,并创建了两个表。我复制了这个表并删除了键,但在wordpress插件中仍然不起作用。如果删除引号
。引用$table_name(id)…
则定义看起来正确。您是否尝试在PHP上下文之外使用普通MySQL客户端创建它们?如果第一个表没有成功创建,或者已经存在不同的定义,那么第二个表将失败。在SQLFIDLE中创建表,()我确实遇到了“定义了多个主键”,因为在
$table\u name2
中的
id
定义中都有
主键,然后在
外键定义之前重复。删除
主键(id)
有效,但与您必须删除FK不一致。无论如何,您都应该在这两条语句之后检查错误,以找出MySQL报告的错误。@mihai在我删除“”时仍然保持不变。。它不生成第二个表,只生成第一个表。@MichaelBerkowski您的代码在mysql中工作并创建了两个表。我复制了这个表并删除了键,但在wordpress插件中仍然不工作。谢谢!它帮助了我。因为您正在使用
$wpdb->query()
创建表,所以可以删除对
dbDelta()
的调用。如果要使用
dbDelta()
,则必须向其传递SQL语句或SQL语句数组。但是,
dbDelta()
不支持使用外键。它主要用于简单的表创建和插件升级的自动表修改;但是,更复杂的场景(如外键、删除列等)不由it处理。有关感谢的更多详细信息,请参阅此答案!它帮助了我。因为您正在使用
$wpdb->query()
创建表,所以可以删除对
dbDelta()
的调用。如果要使用
dbDelta()
,则必须向其传递SQL语句或SQL语句数组。但是,
dbDelta()
不支持使用外键。它主要用于简单的表创建和插件升级的自动表修改;但是,更复杂的场景(如外键、删除列等)不由it处理