フィールドのデフォルト値を「0000-00-00 00:00:00」に設定するにはどうすればいいですか?「0000-00-00 00:00:00」をデフォルトとして使用できない場合はどうすればよいですか?基本的な有効な日付ですか?
たとえば、これは記事テーブルを作成するためのSQLです。
-- -----------------------------------------------------
-- Table `article`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `article` ;
CREATE TABLE IF NOT EXISTS `article` (
`article_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`url` VARCHAR(255) NOT NULL,
`title` VARCHAR(255) NOT NULL,
`date_from` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured from a datetime.',
`date_to` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured to a datetime.',
`backdated_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The manual datetime that is modified or input by the user.',
`created_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The permanent datetime when the article is created.',
`updated_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'The datetime when the article is updated on.',
PRIMARY KEY (`article_id`, `parent_id`, `template_id`),
UNIQUE INDEX `url_UNIQUE` (`url` ASC))
ENGINE = MyISAM
AUTO_INCREMENT = 66
COMMENT = 'Entity that holds the article with one-to-one properties.';
このクエリを実行するとこのエラーが発生します。
#1067 - Invalid default value for 'date_from'
ベストアンサー1
エラーの原因: SQLモード
DATE
SQLモードで許可されている場合、DATETIME
またはフィールドのデフォルト値を、TIMESTAMP
ダミーの日付として特別な「ゼロ」値「0000-00-00」に設定できます。MySQLバージョン5.7.4より前のバージョンでは、これはNO_ZERO_DATEモードによって制御されます。ドキュメンテーション:
MySQL では、「ダミーの日付」として「ゼロ」値 '0000-00-00' を保存できます。これは、NULL 値を使用するよりも便利な場合があり、使用するデータとインデックスのスペースが少なくなります。'0000-00-00' を許可しないようにするには、NO_ZERO_DATE SQL モードを有効にします。
さらに、「ゼロ」値を許可しないように厳密モードを有効にする必要があります。
このモードと厳密モードが有効になっている場合、IGNORE も指定されていない限り、「0000-00-00」は許可されず
、挿入によってエラーが発生します。
現在MySQL 5.7.4これは厳密モードにのみ依存します:
厳密モードは、サーバーが「0000-00-00」を有効な日付として許可するかどうかに影響します。
厳密モードが有効になっていない場合、「0000-00-00」が許可され、挿入によって警告は生成されません。
厳密モードが有効になっている場合、IGNORE も指定されていない限り、「0000-00-00」は許可されず、挿入するとエラーが発生します。INSERT IGNORE および UPDATE IGNORE の場合、「0000-00-00」は許可され、挿入すると警告が発生します。
バージョンとSQLモードを確認する
そのため、MySQLのバージョンとSQL モードMySQLサーバーの
SELECT version();
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
INSERTを有効にする
セッションのsql_modeを設定するには、SET sql_mode = '<desired mode>'
SET sql_mode = 'STRICT_TRANS_TABLES';
DATETIME の有効範囲
サポートされている範囲DATETIME
は
[1000-01-01 00:00:00] to ['9999-12-31 23:59:59'],
したがって、有効な最小の DATETIME 値は '1000-01-01 00:00:00' です。
ただし、この値を使用することはお勧めしません。
追加メモ
MySQL 5.6.5以降では、すべての列TIMESTAMP
とDATETIME
列にマジック動作(初期化および/または更新)を実行できます。TIMESTAMP
最大で1つの列のみ実行できます。TIMESTAMP と DATETIME の自動初期化と更新:
MySQL 5.6.5 以降では、TIMESTAMP 列と DATETIME 列は自動的に初期化され、現在の日付と時刻 (つまり、現在のタイムスタンプ) に更新されます。5.6.5 より前では、これは TIMESTAMP にのみ当てはまり、テーブルごとに最大 1 つの TIMESTAMP 列にのみ当てはまります。次の注記では、最初に MySQL 5.6.5 以降の自動初期化と更新について説明し、次に 5.6.5 より前のバージョンの違いについて説明します。
MySQL 5.6.5 以降の場合は、CREATE TABLE ステートメントを次のように変更できます。
CREATE TABLE IF NOT EXISTS `article` (
`article_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`url` VARCHAR(255) NOT NULL,
`title` VARCHAR(255) NOT NULL,
`date_from` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured from a datetime.',
`date_to` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured to a datetime.',
`backdated_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The manual datetime that is modified or input by the user.',
`created_on` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'The permanent datetime when the article is created.',
`updated_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'The datetime when the article is updated on.',
PRIMARY KEY (`article_id`, `parent_id`, `template_id`),
UNIQUE INDEX `url_UNIQUE` (`url` ASC))
ENGINE = MyISAM
AUTO_INCREMENT = 66
COMMENT = 'Entity that holds the article with one-to-one properties.';