フィールドのデフォルト値を「0000-00-00 00:00:00」に設定するにはどうすればよいですか? 「0000-00-00 00:00:00」をデフォルトとして使用できない場合basic有効なtiemdateとは何ですか?
たとえば、これは記事テーブルを作成するための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'
エラーの原因:SQLモード
SQLの場合、DATE
、DATETIME
、またはTIMESTAMP
フィールドのデフォルト値をダミー日付として '0000-00-00'の特別な「ゼロ」値に設定できます。モードはそれを許可します。 5.7.4よりも前のMySQLバージョンの場合、これはNO_ZERO_DATEモードによって決まります。この documentation の抜粋を参照してください。
MySQLでは、「ダミーの日付」として「0000-00-00」の「ゼロ」値を保存できます。これは、NULL値を使用するよりも便利な場合があり、使用するデータとインデックススペースが少なくなります。 「0000-00-00」を禁止するには、NO_ZERO_DATE SQLモードを有効にします。
さらに、「ゼロ」値を許可しないために、厳密モードを有効にする必要があります。
このモードとストリクトモードが有効になっている場合、「0000-00-00」は許可されません
および挿入は、IGNOREも指定されていない限り、エラーを生成します。
MySQL 5.7.4 以降、これは厳密モードのみに依存します。
厳密モードは、サーバーが「0000-00-00」を有効な日付として許可するかどうかに影響します。
厳格モードが有効になっていない場合、「0000-00-00」が許可され、挿入しても警告は生成されません。
厳格モードが有効な場合、IGNOREも指定されない限り、「0000-00-00」は許可されず、挿入はエラーを生成します。 INSERT IGNOREおよびUPDATE IGNOREの場合、「0000-00-00」が許可され、挿入は警告を生成します。
バージョンとSQLモードを確認してください
したがって、MySQLバージョンとMySQLサーバーの SQLモード を確認する必要があります。
SELECT version();
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
INSERTを有効にします
SET sql_mode = '<desired mode>'
を使用して、セッションのsql_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.';
解決策があります。私はこれのセキュリティについて確信がないので、私はお勧めします
SELECT @@SESSION.sql_mode session
最初。クリップボードに値を保存してから、
SET SESSION sql_mode = '';
その後、「0000-00-00 00:00:00」などのデフォルト値でテーブルを作成または変更できます
SQL Serverの日付は、1753年1月1日から9999年12月31日までの間のみです。
デフォルトまたは欠落した日付時刻を組織またはグループとして処理する方法を決定する必要があります(NULL、またはこれらの極端な方法の1つ)。通常、組織は1753年または9999年の日付の代わりに日付なしで移動することを選択します。日付がない場合は、1750年代や9999年代のように滑dicなように、日付を設定するよりもNULLの方が適切です。欠落している日付をNULLのままにしておくと、レポートが偽の日付を取得することも回避されます。
このようなモードを置き換えることもできます、それは動作します。
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'NO_AUTO_CREATE_USER',''));
からコードを置き換えます:
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 '記事を日付または特集記事として設定します。'、 `date_to` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '記事を新規または特集記事として日時に設定します。'、 ` backdated_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'ユーザーによって変更または入力された手動の日時'、 `created_on` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '記事が表示される永続的な日時'、 `updated_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT'記事が更新された日時 '。、 PRIMARY KEY(` article_id`、 `parent_id`、 `template_id`)、 UNIQUE INDE X `url_UNIQUE`(` url` ASC)) ENGINE = MyISAM AUTO_INCREMENT = 66 COMMENT = '1対1のプロパティで記事を保持するエンティティ';
に
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 '1000-01-01 00:00:00' COMMENT '記事を新規または特集記事として設定a、datetime。 '、 `date_to` DATETIME NOT NULL DEFAULT' 1000-01-01 00:00:00 'COMMENT'記事を新規または特集記事として日付時刻に設定します。 '、 ` backdated_on` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT 'ユーザーによって変更または入力された手動の日時'、 `created_on` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ' '、 `updated_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT'記事が更新された日時。 '、 PRIMARY KEY(` article_id` 、 `parent_id`、` template_id`)、 UNI QUE INDEX `url_UNIQUE`(` url` ASC)) エンジン= MyISAM
それは私のために働いており、PHP 7とmysql 5.7に役立ちます