web-dev-qa-db-ja.com

フィールドのデフォルト値を「0000-00-00 00:00:00」に設定するにはどうすればよいですか?

フィールドのデフォルト値を「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' 
17
laukok

エラーの原因:SQLモード

SQLの場合、DATEDATETIME、または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.';
39
VMai

解決策があります。私はこれのセキュリティについて確信がないので、私はお勧めします

SELECT @@SESSION.sql_mode session

最初。クリップボードに値を保存してから、

SET SESSION sql_mode = '';

その後、「0000-00-00 00:00:00」などのデフォルト値でテーブルを作成または変更できます

6
rebduvid

SQL Serverの日付は、1753年1月1日から9999年12月31日までの間のみです。

デフォルトまたは欠落した日付時刻を組織またはグループとして処理する方法を決定する必要があります(NULL、またはこれらの極端な方法の1つ)。通常、組織は1753年または9999年の日付の代わりに日付なしで移動することを選択します。日付がない場合は、1750年代や9999年代のように滑dicなように、日付を設定するよりもNULLの方が適切です。欠落している日付をNULLのままにしておくと、レポートが偽の日付を取得することも回避されます。

http://msdn.Microsoft.com/en-us/library/ms187819.aspx

2
Patrick Tucci

このようなモードを置き換えることもできます、それは動作します。

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'NO_AUTO_CREATE_USER',''));
0
sree

からコードを置き換えます:

 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に役立ちます

0
Jaymin