私は、このクエリが mysql 5.1 で正しく動作していることを約 98% 確信しています。マシンの 1 つを mysql 5.6 にアップグレードしました。更新を実行すると、次のクエリでデータベース エラーが発生します。
UPDATE diagnostic
LEFT JOIN contact ON diagnosticdata_suppliercontact = contact_id
SET diagnosticdata_suppliercontact = NULL
WHERE (!contactdata_issupplier) OR (contact.contact_id IS NULL);
ただし、テーブル スキーマでは NULL にすることができます。mysql 5.6 で起こった、私たちを悲しませる可能性のある問題や変更を知っている人はいますか?
テーブルの説明は次のとおりです。
mysql> describe diagnostic;
+--------------------------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------------+-------------+------+-----+---------+----------------+
| diagnostic_id | int(11) | NO | PRI | NULL | auto_increment |
| diagnostic_time | int(15) | NO | | NULL | |
| diagnostic_user | int(15) | NO | | NULL | |
| diagnosticdata_time | int(15) | NO | | NULL | |
| diagnosticdata_user | int(15) | NO | | NULL | |
| diagnosticdata_name | varchar(50) | NO | | NULL | |
| diagnosticdata_suppliercontact | int(11) | YES | MUL | NULL | |
+--------------------------------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
ERROR 1048 (23000): Column 'diagnosticdata_suppliercontact' cannot be null
CREATE STATEMENT IS HERE TO トリガーがあります。
delimiter $$
CREATE TABLE `diagnostic` (
`diagnostic_id` int(11) NOT NULL AUTO_INCREMENT,
`diagnostic_time` int(15) NOT NULL,
`diagnostic_user` int(15) NOT NULL,
`diagnosticdata_time` int(15) NOT NULL,
`diagnosticdata_user` int(15) NOT NULL,
`diagnosticdata_name` varchar(50) NOT NULL,
`diagnosticdata_suppliercontact` int(11) DEFAULT NULL,
PRIMARY KEY (`diagnostic_id`),
KEY `diagnostic_suppliercontact` (`diagnosticdata_suppliercontact`) USING BTREE,
CONSTRAINT `fk_diagnosticdata_suppliercontact_contact` FOREIGN KEY (`diagnosticdata_suppliercontact`) REFERENCES `contact` (`contact_id`)
) ENGINE=InnoDB AUTO_INCREMENT=188 DEFAULT CHARSET=utf8$$
CREATE
DEFINER=`dotuser`@`localhost`
TRIGGER `ezymerged`.`diagnostic_insert`
AFTER INSERT ON `ezymerged`.`diagnostic`
FOR EACH ROW
BEGIN
REPLACE INTO ezymerged_history.diagnostic
SELECT diagnostic.* FROM ezymerged.diagnostic
WHERE diagnostic_id=NEW.diagnostic_id;
END
$$
CREATE
DEFINER=`dotuser`@`localhost`
TRIGGER `ezymerged`.`diagnostic_update`
AFTER UPDATE ON `ezymerged`.`diagnostic`
FOR EACH ROW
BEGIN
REPLACE INTO ezymerged_history.diagnostic
SELECT diagnostic.* FROM ezymerged.diagnostic
WHERE diagnostic_id=NEW.diagnostic_id;
END
$$