Mysql

如何查詢 DATE NOT NULL DEFAULT ‘0000-00-00’ 的數據庫表結構並在 MySQL 中更改它們

  • January 31, 2019

我正在使用MySQL v.5.7.x

在一個有 161 個表的數據庫中,其中一個表的結構如下:

CREATE TABLE `prefix_coupon` (
`coupon_id` int (11) NOT NULL AUTO_INCREMENT,
`name` varchar (128) NOT NULL,
`code` varchar (10) NOT NULL,
`type` char (1) NOT NULL,
`discount 'decimal (15,4) NOT NULL,
`logged` tinyint (1) NOT NULL,
`shipping` tinyint (1) NOT NULL,
`total` decimal (15,4) NOT NULL,
`date_start` date NOT NULL DEFAULT '0000-00-00',
`date_end` date NOT NULL DEFAULT '0000-00-00',
`uses_total` int (11) NOT NULL,
`uses_customer` varchar (11) NOT NULL,
`status` tinyint (1) NOT NULL,
`date_added` datetime NOT NULL,
PRIMARY KEY (`coupon_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8

看到柱子date_startdate_end它們的結構了date NOT NULL DEFAULT '0000-00-00'嗎?

有沒有辦法查詢數據庫表

date NOT NULL DEFAULT '0000-00-00'

ALTER他們

ALTER TABLE prefix_coupon CHANGE date_start date_start DATE NULL DEFAULT NULL, CHANGE date_end date_end DATE NULL DEFAULT NULL;

您可以在 INFORMATION_SCHEMA 中找到該資訊:

select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLUMN_DEFAULT 
from information_schema.columns 
where column_default = '''0000-00-00 00:00:00''';

由於 MySQL 缺少 schema 的概念,所以 TABLE_SCHEMA 與數據庫相同

請注意,預設值為 ‘0000-00-00 00:00:00’,因此 ’ 是值的一部分。因此,您需要在引號中加上一個 ’ 以使其正確。

當您修復了預設值和任何數據後,我建議您在 sql_mode 中設置“NO_ZERO_DATE”以防止將來出現這種情況。

‘0000-00-00 00:00:00’ 有一些違反直覺的屬性,例如:

create table tt (x int, y datetime not null default '0000-00-00 00:00:00');
insert into tt (x) values (1);
select * from tt where y is null and y is not null;
+------+---------------------+
| x    | y                   |
+------+---------------------+
|    1 | 0000-00-00 00:00:00 |
+------+---------------------+

您可以更改預設值,例如:

alter table tt alter column y set default '1900-01-01 00:00:00';

因此,您可以使用前面的查詢來生成更改語句,例如:

select 'ALTER ' || TABLE_SCHEMA || '.' || TABLE_NAME 
   || ' ALTER COLUMN ' || COLUMN_NAME || ' SET DEFAULT ''1900-01-01 00:00:00'';' 
from information_schema.columns 
where column_default = '''0000-00-00 00:00:00''';

請注意,您需要在 sql_mode 中為 || 使用“PIPES_AS_CONCAT”。去工作

引用自:https://dba.stackexchange.com/questions/228571