2016-08-03 10 views
3

Ich habe alles versucht, was mir einfällt, aber ich habe immer noch Probleme, einen Tisch zu erstellen.mySQL: Was verhindert meine Fremdschlüsseleinschränkung?

Ich habe einen Benutzer Tabelle mit einem Primärschlüssel username

+---------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+-------+ | created_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | | username | varchar(50) | NO | PRI | NULL | | | administrator | tinyint(1) | YES | | NULL | | | fullname | text | YES | | NULL | | | description | text | YES | | NULL | | | password | varchar(60) | NO | | NULL | | +---------------+-------------+------+-----+---------+-------+

und ich möchte eine neue Tabelle wie folgt erstellen:

CREATE TABLE sessions ( created_at DATETIME, updated_at DATETIME, token VARCHAR(50) NOT NULL, username VARCHAR(50), PRIMARY KEY (token), FOREIGN KEY(username) REFERENCES users (username) );

aber ich bekomme einen bösen Fehler:

ERROR 1215 (HY000): Cannot add foreign key constraint

Ich finde normalerweise, dass dieser Fehler durch eine Nichtübereinstimmung des Datentyps des pk/fk-Paares verursacht wird, aber dieses Mal sind beide eindeutig varchar(50), also sieht es so aus, als wäre das Problem woanders.

Ich habe auch versucht, dies für alle Fälle:

CREATE TABLE sessions ( created_at DATETIME, updated_at DATETIME, token VARCHAR(50) NOT NULL, username varchar(50) NOT NULL, #<- ***added not null*** PRIMARY KEY (token), FOREIGN KEY(username) REFERENCES users (username) );

mysql>SHOW ENGINE INNODB STATUS

LATEST FOREIGN KEY ERROR

2016-08-03 15:13:23 a46fcb70 Error in foreign key constraint of table savesdev/sessions: FOREIGN KEY(username) REFERENCES users (username)): Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint. Note that the internal storage type of ENUM and SET changed in tables created with >= InnoDB-4.1.12, and such columns in old tables cannot be referenced by such columns in new tables. See http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html for correct foreign key definition.

Es ist der Fehler scheint unter zwei Umständen erhöht wird:

1) Wenn es eine ist Mismatch (was ich ausgeschlossen habe)

column types in the table and the referenced table do not match for constraint.

2) Wenn kein geeigneter Index

Cannot find an index in the referenced table where the referenced columns appear as the first columns

auf der referenzierten Spalte ist denke ich, diese beiden sind abgedeckt, so was ist der Deal?

Kann jemand meinen Fehler finden?

+0

'show engine innodb status'. ungefähr 1/2 durch den Speicherabzug wird ein "letzter Fremdschlüsselfehler" Abschnitt mit Details sein. Höchstwahrscheinlich haben Sie eine Felddefinitionskonflikt. FK-Beziehungen müssen identisch sein, z.B. 'varchar (49) -> varchar (50)' ist nicht erlaubt, aber 'varchar (50) -> varchar (50)' ist. oder Sie befinden sich auf einer älteren MySQL-Datenbank, die Indizes für FK-Felder nicht automatisch erstellt, und Sie haben nicht manuell einen Schlüssel für den Benutzernamen hinzugefügt. –

+0

Vielleicht haben Ihre Spalten Benutzername unterschiedliche Zeichensatz können Sie dies versuchen: ALTER TABLE Sitzungen MODIFY Benutzername VARCHAR (50) CHARACTER SET utf8; ALTER TABLE Benutzer MODIFY Benutzername VARCHAR (50) CHARACTER SET utf8; –

+0

Das ist ein guter Punkt @elkorchianas, werde ich mir ansehen .. –

Antwort

3

Vielleicht Benutzername Ihre Spalten haben unterschiedliche charset können Sie dies versuchen:

ALTER TABLE sessions MODIFY username VARCHAR(50) CHARACTER SET utf8; 
ALTER TABLE users MODIFY username VARCHAR(50) CHARACTER SET utf8; 

vorgeschlagen Wie @Graeme Stuart hier ist ein Link, um zu sehen, wie wir die Charterer Satz einer Datenbank/Tabelle oder einer Spalte überprüfen : How do I see what character set a MySQL database/table/column is?

+1

Ja , die Felder waren beide VARCHAR (50), aber die vorhandene Tabelle hatte eine utf8_general_ci-Sortierung, die sie inkompatibel machte.Meine tatsächliche Lösung bestand darin, die neue Tabelle mit der Sortierung utf8_general_ci für die Fremdschlüsselspalte zu erstellen. –

Verwandte Themen