Mysql Wordpress使用外键创建数据库
我正在尝试创建一个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()
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处理