web-dev-qa-db-ja.com

wp_usersを外部キーとして参照する際のエラー

私はSQLにかなり慣れていません。テーブル(_time_sheet_)の1つをWordpressテーブル(_wp_users_)の1つにFKを作成しようとしていますが、エラーが発生していますそして、それがなぜなのか完全にはわかりません。

これは、テーブル_time_sheet_を作成するための私のSQLステートメントです。

_Create table Time_Sheets
(
 id bigint AUTO_INCREMENT NOT NULL,
    project_id varchar(255) not null,
    username varchar(250) not null,
    task varchar(255) not null,
    description varchar(255) not null,
    hours int(10) not null,
    time_date varchar(255) not null,
    PRIMARY KEY (id),
    FOREIGN KEY (project_id) REFERENCES Time_Sheet_Projects(project_id),
    FOREIGN KEY (task) REFERENCES Task_List(name),
    FOREIGN KEY (username) REFERENCES wp_users(display_name),
    CHECK (hours > 0)
)
_

これはWordpressデータベーススキーマの画像です。

Schema

この行FOREIGN KEY (username) REFERENCES wp_users(display_name),を削除すると、クエリは完全に正常に実行されます。

名前/列名を確認しましたが、正しいことです。これが機能しない理由はわかりません。

_show create table wp_users_

_CREATE TABLE `wp_users` (
 `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `user_login` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `user_pass` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `user_nicename` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `user_email` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `user_url` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `user_activation_key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `user_status` int(11) NOT NULL DEFAULT '0',
 `display_name` varchar(250) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 PRIMARY KEY (`ID`),
 KEY `user_login_key` (`user_login`),
 KEY `user_nicename` (`user_nicename`),
 KEY `user_email` (`user_email`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
_

編集:つまり、データベースエンジンが異なることが問題であることがわかりました。 wp_usersをInnoDBに切り替えた後、すべてがうまく機能しています。

3
Radizzt

MyISAMエンジンは外部キーをサポートしていません。代わりにInnoDBエンジンを使用してください。

その他の観察:

参照されるテーブルには、_display_name_のインデックスがありません。ドキュメントに従って、参照されるフィールドにインデックスが必要です。

ただし、参照する_wp_users_テーブルのIDフィールドを使用し、このIDを使用して_display_name_を検索することをお勧めします。

_FOREIGN KEY (user_id) REFERENCES wp_users(id)
_

さらに、_time_sheet_テーブルのフィールドをusername varchar(250) not null,から_user_id BIGINT not null..._に変更します。

2
Jehad Keriaki

外部キーフィールドが機能するためには、参照するフィールドとまったく同じデータ型である必要があります-これには属性が含まれます。

私はまったく同じことで髪を引っ張っていましたが、次の列定義を使用して機能しました

user_id BIGINT(20) UNSIGNED NOT NULL

私になってきたのは、列をUNSIGNEDに設定していなかったことです。これは、負の値が格納されるのを防ぐ属性です。属性を含めて列定義が一致したら、標準のFOREIGN KEY構文を使用できます。

FOREIGN KEY (user_id)
REFERENCES wp_users (ID)
1
James Cushing