Original post - http://anothermysqldba.blogspot.com/2014/08/mysql-foreign-keys-example-error-1452.html
だから私は、フィールドを更新する必要が扱っ今日の状況に偶然出会ったため、ユーザは、関連する外部キー制約をそうすることができませんでした。
このブログ投稿では、外部キーを示すとどのようにあなたがそうしなければならない場合は、それらを更新するための簡単な例であると。
まず私たちは簡単なテーブルを作成してみましょうと、ランダムなデータを移入。
今、私たちは私たちの前のテーブルに関連付けられて外部キーを持つ別のテーブルが必要になります。
だから私たちがしようとすると、後でそれらを更新できるように、私たちは、テーブルにいくつかのランダムなデータを移入してみましょう。
必要に応じて、乱数についての以前の記事はこちら
OKそれは、この例のいくつかのランダムなデータを生成する方法についてのラウンドがある。
私たちはtable_with_fkにおけるABC値に関連するデータを更新するために必要な場合に何が起こりますか?
それがされている必要がありますようなので、それがブロックされました。 私たちは、すべての後に表定義で「ONがUPDATE ON DELETE NO ACTIONがNO ACTION」がないです。
すべては、しかし失われることはありません。 「FOREIGN_KEY_CHECKS "変数の簡単な編集は、更新ステートメントを実行することができます。 しかし、それはトランザクション内で、私の意見では、これを実行する方が安全です。
あなたが理由で所定の位置に設定していたあなたの外部キーの値を壊したくなる理由さて、全体的な質問は? それは完全にあなた次第です。
今日では、何らかの形での値がデータベースに値内の余分な空白が挿入されていたことが起こった。 だから私は、ホワイトスペースを更新および削除、同様の取引をした。
全体的に...これはちょうどそれが行うことができますを示すことである。
だから私は、フィールドを更新する必要が扱っ今日の状況に偶然出会ったため、ユーザは、関連する外部キー制約をそうすることができませんでした。
このブログ投稿では、外部キーを示すとどのようにあなたがそうしなければならない場合は、それらを更新するための簡単な例であると。
まず私たちは簡単なテーブルを作成してみましょうと、ランダムなデータを移入。
CREATE TABLE `table_w_code` (
`SOMECode` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`NameofCode` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`SOMECode`)
) ENGINE=InnoDB ;
今、私たちは私たちの前のテーブルに関連付けられて外部キーを持つ別のテーブルが必要になります。
[anothermysqldba]> CREATE TABLE `table_with_fk` (
`SOMEID` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`SOMECode` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`Somemorefields` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`SOMEID`,`SOMECode`),
KEY `FK_Patient_Facility` (`SOMECode`),
CONSTRAINT `FK_CODE` FOREIGN KEY (`SOMECode`) REFERENCES `table_w_code` (`SOMECode`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB;
だから私たちがしようとすると、後でそれらを更新できるように、私たちは、テーブルにいくつかのランダムなデータを移入してみましょう。
必要に応じて、乱数についての以前の記事はこちら
[anothermysqldba]> SET @A = 3;
Query OK, 0 rows affected (0.00 sec)
[anothermysqldba]> SET @B = 15 - @A;
Query OK, 0 rows affected (0.00 sec)
[anothermysqldba]> SET @C = 16;
Query OK, 0 rows affected (0.00 sec)
[anothermysqldba]> SET @D = 25 - @C;
Query OK, 0 rows affected (0.00 sec)
[anothermysqldba]> INSERT INTO table_w_code VALUES
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'ABC' ) ,
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'DEF' ) ,
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'GHI' ) ,
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'JKL' ) ,
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'MNO' ) ,
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'PQR' ) ,
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'STU' ) ,
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'VWX' ) ,
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'YZ' ) ;
Query OK, 9 rows affected (0.05 sec)
Records: 9 Duplicates: 0 Warnings: 0
[anothermysqldba]> SELECT * from table_w_code ORDER BY NameofCode;
+--------------------------+------------+
| SOMECode | NameofCode |
+--------------------------+------------+
| 204e9800998ecf8427e | ABC |
| f00b204e9800998e | DEF |
| 98f00b204e9800998ecf8427 | GHI |
| 98f00b204e9800998e | JKL |
| 1d8cd98f00b204e9800 | MNO |
| 1d8cd98f00b204e9800998ec | PQR |
| 0b204e9800998ecf8427e | STU |
| cd98f00b204e9800998ec | VWX |
| d98f00b204e9800998ecf842 | YZ |
+--------------------------+------------+
9 rows in set (0.00 sec)
[anothermysqldba]> SET @D = 2;
Query OK, 0 rows affected (0.00 sec)
[anothermysqldba]> SET @E = 25 - @D;
Query OK, 0 rows affected (0.00 sec)
[anothermysqldba]> INSERT INTO table_with_fk SELECT SUBSTR(md5(''),FLOOR( @D + (RAND() * @E ))), SOMECode , NameofCode FROM table_w_code;
Query OK, 9 rows affected (0.08 sec)
Records: 9 Duplicates: 0 Warnings: 0
[anothermysqldba]> select * from table_with_fk ORDER BY Somemorefields;
+---------------------------------+--------------------------+----------------+
| SOMEID | SOMECode | Somemorefields |
+---------------------------------+--------------------------+----------------+
| 41d8cd98f00b204e9800998ecf8427e | 204e9800998ecf8427e | ABC |
| e9800998ecf8427e | f00b204e9800998e | DEF |
| 98ecf8427e | 98f00b204e9800998ecf8427 | GHI |
| 00b204e9800998ecf8427e | 98f00b204e9800998e | JKL |
| 04e9800998ecf8427e | 1d8cd98f00b204e9800 | MNO |
| 04e9800998ecf8427e | 1d8cd98f00b204e9800998ec | PQR |
| b204e9800998ecf8427e | 0b204e9800998ecf8427e | STU |
| b204e9800998ecf8427e | cd98f00b204e9800998ec | VWX |
| 4e9800998ecf8427e | d98f00b204e9800998ecf842 | YZ |
+---------------------------------+--------------------------+----------------+
OKそれは、この例のいくつかのランダムなデータを生成する方法についてのラウンドがある。
私たちはtable_with_fkにおけるABC値に関連するデータを更新するために必要な場合に何が起こりますか?
[anothermysqldba]> SELECT SOMEID , SOMECode , Somemorefields FROM table_with_fk WHERE Somemorefields = 'ABC';
+---------------------------------+---------------------+----------------+
| SOMEID | SOMECode | Somemorefields |
+---------------------------------+---------------------+----------------+
| 41d8cd98f00b204e9800998ecf8427e | 204e9800998ecf8427e | ABC |
+---------------------------------+---------------------+----------------+
[anothermysqldba]> SELECT SOMECode , NameofCode FROM table_w_code WHERE NameofCode = 'ABC';
+---------------------+------------+
| SOMECode | NameofCode |
+---------------------+------------+
| 204e9800998ecf8427e | ABC |
+---------------------+------------+
[anothermysqldba]>
UPDATE table_with_fk SET SOMEID = 'I UPDATED THIS' , SOMECode = 'I UPDATED THIS' WHERE SOMECode = '204e9800998ecf8427e';
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails(`anothermysqldba`.`table_with_fk`, CONSTRAINT `FK_CODE` FOREIGN KEY (`SOMECode`) REFERENCES `table_w_code` (`SOMECode`) ON DELETE NO ACTION ON UPDATE NO ACTION)
それがされている必要がありますようなので、それがブロックされました。 私たちは、すべての後に表定義で「ONがUPDATE ON DELETE NO ACTIONがNO ACTION」がないです。
すべては、しかし失われることはありません。 「FOREIGN_KEY_CHECKS "変数の簡単な編集は、更新ステートメントを実行することができます。 しかし、それはトランザクション内で、私の意見では、これを実行する方が安全です。
[anothermysqldba]> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
[anothermysqldba]> SET FOREIGN_KEY_CHECKS=0;
Query OK, 0 rows affected (0.00 sec)
[anothermysqldba]> UPDATE table_with_fk SET SOMEID = 'I UPDATED THIS' , SOMECode = 'I UPDATED THIS' WHERE SOMECode = '204e9800998ecf8427e';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
[anothermysqldba]> SET FOREIGN_KEY_CHECKS=1;
Query OK, 0 rows affected (0.00 sec)
[anothermysqldba]> COMMIT;
Query OK, 0 rows affected (0.07 sec)
あなたが理由で所定の位置に設定していたあなたの外部キーの値を壊したくなる理由さて、全体的な質問は? それは完全にあなた次第です。
今日では、何らかの形での値がデータベースに値内の余分な空白が挿入されていたことが起こった。 だから私は、ホワイトスペースを更新および削除、同様の取引をした。
全体的に...これはちょうどそれが行うことができますを示すことである。