0

MySQLで3つのテーブルを作成しています(Users、linkPosts、replyPosts)

最初の2つのテーブルは正常に実行されますが、replyPostsのSQLを挿入しようとするとエラーが発生しました。以下は、3つのテーブルのSQLコードです。

最初のテーブルSQLコード:正常に動作します

CREATE TABLE Users ( 
userName VARCHAR (20) NOT NULL PRIMARY KEY,
password VARCHAR (20),
firstName VARCHAR (200),
lastName VARCHAR (200),
bio VARCHAR (160),
email VARCHAR (200),
country VARCHAR (200)
); 

2番目のテーブルのコード:正常に動作します

CREATE TABLE linkPosts ( 
linkPostID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
link VARCHAR(255),
linkDescription VARCHAR (140), 
linkPostTime TIMESTAMP,
userName VARCHAR (20),
FOREIGN KEY (userName) REFERENCES Users(userName));

エラーが表示される3番目のテーブル:

CREATE TABLE replyPosts ( 
replyPostID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
reply VARCHAR (140), 
replyPostTime TIMESTAMP,
userName VARCHAR (20),
linkPostID INT,
FOREIGN KEY (linkPostID) REFERENCES linkPosts(linkPostID),
FOREIGN KEY (userName) REFERENCES Users(userName));

私が得たエラーは次のとおりです。

Error 1005 : Can't create table 'mdb_aa847.replyPosts' (errno: 150)

私は他の人の解決策を探して試しましたが、うまくいきませんでした。誰でもエラーがどこにあるかを理解できますか?

前もって感謝します..

4

2 に答える 2

1

テーブルreplyPostsはすでに存在しますか?このエラーは、外部キー名が重複している場合に発生する可能性があります。errno(あなたの場合はそのエラー150)でperrorを使用すると、次のようになります。

MySQL error code 150: Foreign key constraint is incorrectly formed

完全なSQLを確認した後、LinkPostsテーブルを作成するときにlinkPostIDがINT UNSIGNEDであるのに対し、ReplyPostsテーブルではlinkPostIDがINTであるという事実にかかっていると思います。これをINTUNSIGNEDに変更し、機能するかどうかを確認します。

ここのドキュメントによると、「外部キー」は、整数の場合、同じサイズと符号を持つ必要があります。

ちなみに、UserNameの代わりにUsersテーブルの主キーとしてUserIdを使用することを主張します。ユーザーテーブルにレコードを挿入するたびに、ユーザー名で並べ替えられます(これは主キーであるため、クラスター化インデックスであるため)。UserNameフィールド(Varchar(20))が大きいほど、テーブル全体の並べ替えに時間がかかります。テーブルが大きくなるにつれて、Userテーブルにレコードを挿入するのは面倒になります。

于 2012-11-29T11:50:41.007 に答える
0

これは外部キーの制約によるものです

また、varcharであるを使用しFOREIGN KEY (userName) REFERENCES Users(userName) ているため、MYSQLで外部参照を作成することはできません。varchar

userNameの外部キー制約を削除して、userIdで試すことができます

于 2012-11-29T11:42:22.853 に答える