我试图添加一个与{wp_posts}表有关系的新表,这段代码在localhost中正常运行,它通过了所有测试但在服务器数据库上失败并生成[无法添加外键约束]。
[post_id]字段与{wp_posts-> ID}字段完全相同..我不知道我错过了什么。
global $wpdb;
$charset_collate = $wpdb->collate;
$tbl_my_users = $wpdb->prefix . '_TABLE_NAME';
dbDelta( "CREATE TABLE IF NOT EXISTS {$tbl_my_users} (
user_id BIGINT(20) UNSIGNED NOT NULL,
post_id BIGINT(20) UNSIGNED NOT NULL,
name VARCHAR(150) NOT NULL,
email TINYTEXT NULL,
INDEX (name),
PRIMARY KEY (user_id),
CONSTRAINT Constr_Unique_UserID UNIQUE( user_id ),
CONSTRAINT Constr_Unique_PostID UNIQUE( post_id ),
CONSTRAINT Constr_Unique_User UNIQUE( name ),
CONSTRAINT Constr_My_Users
FOREIGN KEY FK_My_Users (post_id) REFERENCES {$wpdb->posts} (ID) ON DELETE CASCADE ON UPDATE CASCADE
) COLLATE {$charset_collate}" );
答案 0 :(得分:0)
尝试这个bewlo查询
global $wpdb;
$charset_collate = $wpdb->collate;
$tbl_my_users = $wpdb->prefix . '_TABLE_NAME';
dbDelta("CREATE TABLE IF NOT EXISTS ".$tbl_my_users." (
user_id BIGINT(20) UNSIGNED NOT NULL,
post_id BIGINT(20) UNSIGNED NOT NULL,
name VARCHAR(150) NOT NULL,
email TINYTEXT NULL,
INDEX (name),
PRIMARY KEY (user_id),
CONSTRAINT Constr_Unique_UserID UNIQUE( user_id ),
CONSTRAINT Constr_Unique_PostID UNIQUE( post_id ),
CONSTRAINT Constr_Unique_User UNIQUE( name ),
CONSTRAINT Constr_My_Users
FOREIGN KEY (`post_id`) REFERENCES ".$wpdb->prefix."posts (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
) COLLATE SET utf8 COLLATE utf8_general_ci" );
答案 1 :(得分:0)
老问题,但我现在面临这个问题。
问题是当我们要设置关系时,我们需要匹配列类型,排序规则和引擎。
wp_posts ID:bigint(20) UNSIGNED
您的表post_id:bigint(20) UNSIGNED
这是匹配项,但是您对ENGINE
有疑问。
示例:旧表写为innodb
,但是您的MYSQL默认引擎设置为MYISAM
。因此,您无需定义ENGINE类型,就可以创建MYISAM
表而不是InnoDB
表,该表不支持关系/外键。注意:旧的mysql版本使用MYISAM
作为默认引擎,而不是InnoDB
在我的问题中:
wp_posts ID:bigint(20)未签名的InnoDB
我的表post_id:bigint(20)InnoDB
引擎和类型匹配,但是我犯了错误。因为我忘记设置属性UNSIGNED
。当我设置相同的属性时,一切都完美无缺。
注意:使用collation
等字符串类型时,请不要忘记varchar, char
我希望这会对其他人有所帮助。