Mysql
如何查詢 DATE NOT NULL DEFAULT ‘0000-00-00’ 的數據庫表結構並在 MySQL 中更改它們
我正在使用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_start
和date_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”。去工作