无法使用WordPress wp_posts表添加外键

时间:2017-07-07 12:26:11

标签: php mysql wordpress foreign-keys

我试图添加一个与{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}" );

2 个答案:

答案 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

我希望这会对其他人有所帮助。