Bạn có thể làm điều này - lặp lại khi cần thiết cho mỗi cột:
UPDATE `table1` SET
`col1` = IFNULL(col1, 0),
`col2` = IFNULL(col2, 0);
Ví dụ:
DROP TABLE IF EXISTS `table1`;
CREATE TABLE `table1` (
`id` int(10) unsigned NOT NULL auto_increment,
`col1` int(10) unsigned,
`col2` int(10) unsigned,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO `table1` VALUES
(1, 1, NULL),
(2, NULL, NULL),
(3, 2, NULL),
(4, NULL, NULL),
(5, 3, 4),
(6, 5, 6),
(7, 7, NULL);
UPDATE `table1` SET
`col1` = IFNULL(col1, 0),
`col2` = IFNULL(col2, 0);
SELECT * FROM `table1`;
+----+------+------+
| id | col1 | col2 |
+----+------+------+
| 1 | 1 | 0 |
| 2 | 0 | 0 |
| 3 | 2 | 0 |
| 4 | 0 | 0 |
| 5 | 3 | 4 |
| 6 | 5 | 6 |
| 7 | 7 | 0 |
+----+------+------+
CẬP NHẬT
Nếu bạn muốn thay đổi cấu trúc bảng bằng cách thay đổi cột để họ không còn chấp nhận null, bạn có thể làm điều đó với một thủ tục được lưu trữ. Các thủ tục được lưu trữ sau truy vấn INFORMATION_SCHEMA COLUMNS để biết thông tin về các cột trong một bảng cơ sở dữ liệu đã cho. Từ thông tin đó, nó xây dựng một câu lệnh chuẩn bị sau đó được sử dụng để thay đổi cấu trúc bảng.Bạn có thể cần phải tinh chỉnh nó cho phù hợp với yêu cầu chính xác của bạn - tại thời điểm này, có vẻ cho INT
cột mà không có NOT NULL
thiết lập:
delimiter //
DROP PROCEDURE IF EXISTS no_nulls//
CREATE PROCEDURE `no_nulls` (IN param_schema CHAR(255), IN param_table CHAR(255))
BEGIN
SET @alter_cmd = (SELECT CONCAT(
'ALTER TABLE ',
param_table,
GROUP_CONCAT(
' MODIFY COLUMN ',
`column_name`, ' ',
`column_type`,
' NOT NULL'
SEPARATOR ', ')
) AS `sql_cmd`
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `table_schema` = param_schema
AND `table_name` = param_table
AND LCASE(`data_type`) = 'int'
AND LCASE(`is_nullable`) = 'yes');
IF NOT ISNULL(@alter_cmd) THEN
SELECT @alter_cmd;
PREPARE stmt FROM @alter_cmd;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END//
delimiter ;
Ví dụ:
CREATE TABLE `test`.`table1` (
`id` int(10) unsigned NOT NULL auto_increment,
`col1` int(10) unsigned,
`col2` int(10) unsigned,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CALL no_nulls('test', 'table1');
+----------------------------------------------------------------------------------------------------------------+
| @alter_cmd |
+----------------------------------------------------------------------------------------------------------------+
| ALTER TABLE table1 MODIFY COLUMN col1 int(10) unsigned NOT NULL, MODIFY COLUMN col2 int(10) unsigned NOT NULL |
+----------------------------------------------------------------------------------------------------------------+
SHOW CREATE TABLE `test`.`table1`;
CREATE TABLE `table1` (
`id` int(10) unsigned NOT NULL auto_increment,
`col1` int(10) unsigned NOT NULL,
`col2` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Các dòng sau sẽ hiển thị lệnh đó là để được thực thi, và có thể được gỡ bỏ từ thủ tục lưu trữ nếu cần thiết:
SELECT @alter_cmd;
Ra khỏi tò mò bao nhiêu cột mà bạn có mà bạn cần thay đổi từ null để 0 hoặc w/e ehhe :) – Prix
Nó ´ chỉ tò mò thôi. Trong trường hợp đặc biệt này, tôi sẽ không cần bất cứ thứ gì vì nó chỉ là 5 hoặc 6 cols. Nhưng các bảng khác tôi làm việc với dễ dàng có 60 cột. Đó là lý do tại sao tôi muốn biết làm thế nào để làm điều đó trong một kịch bản như vậy quá. –