2017-11-19 51 views
0

登録フォームが完全に機能していますが、何らかの理由でデータベースに追加されませんでした。だから私は、phpMyAdminの中でこのクエリをテストし、私はこのエラーMYSQL ERROR 1452強制キー制約が失敗する

クエリが見つかりました:

INSERT INTO `EMTS`(`name`, `nickname`, `age`, `number`, `city`, `password`, `street`, `building`) 
VALUES ("Alice","Aa","21","414514151","New York","111","main","x") 

を、私は意図的に他の列を埋めていませんでした。他のデータベースでは、これは何の問題も

エラーを起こさない:

#1452 - Cannot add or update a child row: a foreign key constraint fails (mydb . emts , CONSTRAINT fk_EMTS_shifts1 FOREIGN KEY (shifts_idshifts) REFERENCES shifts (idshifts) ON DELETE NO ACTION ON UPDATE NO ACTION)

これは、EMTSテーブルです:

CREATE TABLE IF NOT EXISTS mydb.EMTS(
idEMTS INT NOT NULL AUTO_INCREMENT, 
name VARCHAR(45) NOT NULL, 
nickname VARCHAR(45) NOT NULL, 
age VARCHAR(45) NOT NULL, 
number VARCHAR(45) NOT NULL, 
email VARCHAR(45) NOT NULL, 
city VARCHAR(255) NOT NULL, 
password VARCHAR(45) NOT NULL, 
shifts_idshifts INT(45) NOT NULL, 
bloodtype_id INT NOT NULL, 
street VARCHAR(45) NOT NULL, 
building VARCHAR(45) NOT NULL, 
    PRIMARY KEY (idEMTS), 
    INDEX fk_EMTS_shifts1_idx(shifts_idshifts ASC), 
    INDEX fk_EMTS_bloodtype1_idx(bloodtype_id ASC), 
    UNIQUE INDEX nickname_UNIQUE(nickname ASC), 
    CONSTRAINT fk_EMTS_shifts1 
    FOREIGN KEY (shifts_idshifts) 
    REFERENCES mydb.shifts(idshifts) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT fk_EMTS_bloodtype1 
    FOREIGN KEY (bloodtype_id) 
    REFERENCES mydb.bloodtype(id) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

これはbloodtypeテーブルです:

CREATE TABLE IF NOT EXISTS mydb.bloodtype(
type INT NOT NULL, 
id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (id)) 
ENGINE = InnoDB; 

このシフトテーブルです:

CREATE TABLE IF NOT EXISTS mydb.shifts(
startdate INT NOT NULL, 
enddate VARCHAR(45) NOT NULL, 
day VARCHAR(45) NOT NULL, 
idshifts INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (idshifts)) 
ENGINE = InnoDB; 

私は何が間違っているのですか?

+0

あなたの答えは、すぐそこにある、それを充填shifts_idshifts' '必要があり、あなたはそれを記入していなかった – Forbs

+0

は、このSQL ServerまたはMySQLのです:あなたはまた、strictモードを自分で設定することができますか? – Sami

答えて

1

ローカルMySQLインスタンスでクエリをテストしました。

上記のように、外部キー列の値は指定しませんでした。しかし、それらはNULLカラムではなく、デフォルト値はありません。外部キー列の

mysql> INSERT INTO `EMTS`(`name`, `nickname`, `age`, `number`, `city`, `password`, `street`, `building`) 
    -> VALUES ("Alice","Aa","21","414514151","New York","111","main","x"); 
Query OK, 1 row affected, 3 warnings (0.02 sec) 

mysql> show warnings; 
+---------+------+------------------------------------------------------+ 
| Level | Code | Message            | 
+---------+------+------------------------------------------------------+ 
| Warning | 1364 | Field 'email' doesn't have a default value   | 
| Warning | 1364 | Field 'shifts_idshifts' doesn't have a default value | 
| Warning | 1364 | Field 'bloodtype_id' doesn't have a default value | 
+---------+------+------------------------------------------------------+ 
3 rows in set (0.01 sec) 

mysql> select * from EMTS; 
+--------+-------+----------+-----+-----------+-------+----------+----------+-----------------+--------------+--------+----------+ 
| idEMTS | name | nickname | age | number | email | city  | password | shifts_idshifts | bloodtype_id | street | building | 
+--------+-------+----------+-----+-----------+-------+----------+----------+-----------------+--------------+--------+----------+ 
|  3 | Alice | Aa  | 21 | 414514151 |  | New York | 111  |    0 |   0 | main | x  | 
+--------+-------+----------+-----+-----------+-------+----------+----------+-----------------+--------------+--------+----------+ 

お知らせ両方が値0

を与えている:だからMySQLは、私はFOREIGN KEY制約をドロップして、再度INSERTを試みることによってこれを示す値で0

を埋めます

外部キー列に値を指定しない場合は、それらをNULL可能な列にします。 NULLは存在してもかまいません。外部キー制約違反は発生しません。 0はNULLではない値ですが、シフトと血液型の参照先テーブルには存在しません。

https://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.htmlは言う:整数列の

For data entry into a NOT NULL column that has no explicit DEFAULT clause, if an INSERT or REPLACE statement includes no value for the column, or an UPDATE statement sets the column to NULL, MySQL handles the column according to the SQL mode in effect at the time:

  • If strict SQL mode is enabled, an error occurs for transactional tables and the statement is rolled back. For nontransactional tables, an error occurs, but if this happens for the second or subsequent row of a multiple-row statement, the preceding rows will have been inserted.

  • If strict mode is not enabled, MySQL sets the column to the implicit default value for the column data type.

暗黙のデフォルト値は、これは多くの開発者が混同される原因となったMySQLの奇妙な行動である0

です。カラムがNOT NULLの場合、なぜNULLを挿入することができますか?また、デフォルトでは未定義の暗黙的なデフォルトがデフォルトになりますか?これは直感的ではありません。

このため、新しいバージョンのMySQL 5.7以降では厳密モードがデフォルトになっています。 。

mysql> SET sql_mode='strict_all_tables'; 

mysql> INSERT INTO `EMTS`(`name`, `nickname`, `age`, `number`, `city`, `password`, `street`, `building`) 
    -> VALUES ("Alice","Aa","21","414514151","New York","111","main","x"); 
ERROR 1364 (HY000): Field 'email' doesn't have a default value 
+0

しかし、後でnullオブジェクトを更新できますか?私はテーブルの血統を埋めるために、bloodtype_idの外部キーにbloodtypeテーブルのプライマリキー(id)の値を挿入するつもりです。私はSQLの初心者です –

+0

はい、あなたはNULLを許可します(しかし、あなたのものと同じように、カラムが 'NOT NULL'と宣言されている場合は無効になります)。その後、 'UPDATE'を使用して、外部キーを満たす値を行に与えます。 –

関連する問題