0

私は、このクエリが 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
$$
4

1 に答える 1

0

は制約diagnosticdata_suppliercontactを許可しますが、次のことができます。NULL

CONSTRAINT `fk_diagnosticdata_suppliercontact_contact`
FOREIGN KEY (`diagnosticdata_suppliercontact`)
REFERENCES `contact` (`contact_id`)

が優先され、値がテーブル内のフィールドにdiagnosticdata_suppliercontact一致する値を持つ必要があります。contact_idcontact

于 2013-05-07T00:32:04.383 に答える