1

PHPで次のmysqlクエリがあり、正常に動作します。

$strUpdate = "INSERT INTO  `batchfolder`.`newbatch` (`BatchID` ,`Batch` ,`barcode` ,`PG`)VALUES (NULL ,  '',  '1',  '')";

また、データベースで直接実行する場合も問題ありません。

ただし、Javaで実行すると、

 try {
          conn = DriverManager.getConnection (url, userName, password);
          Statement st = conn.createStatement();
          st.execute("INSERT INTO  `batchfolder`.`newbatch` (`BatchID` ,`Batch` ,`barcode` ,`PG`)VALUES (NULL ,  '',  '1',  '')");            
          st.close();
}

次のエラーが発生します。

Exception in thread "main" java.sql.SQLException: Field 'Pre' doesn't have a default value

Preはデータベースの次の行であり、デフォルト値はありません。

私の質問は、このクエリがmysqlとphpでどのように正常に実行されるかということです。

PS BatchIDは、newbatchのint(10) autoincremented値です。

これが私のテーブル構造です。

CREATE TABLE IF NOT EXISTS `newbatch` (
  `BatchID` int(10) NOT NULL AUTO_INCREMENT,
  `Batch` varchar(100) NOT NULL,
  `barcode` varchar(5) NOT NULL,
  `Ly` varchar(5) NOT NULL DEFAULT '0',
  `PG` varchar(5) NOT NULL,
  `Pre` varchar(5) NOT NULL,
  `Flu` varchar(5) NOT NULL,
  `FluID` varchar(100) DEFAULT NULL,
  `DateCreated` varchar(100) DEFAULT NULL,
  `Comments` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`BatchID`),
  UNIQUE KEY `FluID` (`FluID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1000160 ;
4

3 に答える 3

4

これが実際にPHPで実行されていることを絶対に確信していますか?エラーメッセージが表示されない場合があります。

でこれを再試行してください。display_errors = 'on'これerror_reporting(E_ALL | E_STRICT); はSQLエラーであり、ドライバーに依存しません。ドライバーはあなたにメッセージを表示するだけです。

更新: Javaが何らかの理由でMySQLの厳密モードをオフにしているようです。(私の知る限り)この動作を引き起こすことができるのは、MySQLの厳密モードがオフになっていることだけです。

strictモードが有効になっていない場合、MySQLは列を列データ型の暗黙的なデフォルト値に設定します。

サーバーが実行されているモードは、で確認できますSELECT @@GLOBAL.sql_mode;。JavaとPHPの両方でそれを試してください。結果が異なる場合は、それがあなたの答えです。

UPDATE2: ジェップ!

于 2012-05-31T23:18:03.857 に答える
1

テーブル定義を見ると、事前にnullではないと定義されていますが、挿入でその値を指定しなかったため、適切なエラーが表示されるはずです。

于 2012-05-31T23:32:21.417 に答える
0

'NOT NULL'であるデータベースフィールドがいくつかあるため、INSERTステートメントでこれらを指定する必要があります。これがPHPでどのように機能するか想像もできませんでした。

于 2012-05-31T23:43:39.663 に答える