私は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データベーススキーマの画像です。
この行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に切り替えた後、すべてがうまく機能しています。
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...
_に変更します。
外部キーフィールドが機能するためには、参照するフィールドとまったく同じデータ型である必要があります-これには属性が含まれます。
私はまったく同じことで髪を引っ張っていましたが、次の列定義を使用して機能しました
user_id BIGINT(20) UNSIGNED NOT NULL
私になってきたのは、列をUNSIGNED
に設定していなかったことです。これは、負の値が格納されるのを防ぐ属性です。属性を含めて列定義が一致したら、標準のFOREIGN KEY
構文を使用できます。
FOREIGN KEY (user_id)
REFERENCES wp_users (ID)