因为 MySQL 不支持在 `ALTER TABLE` 中使用 `IF NOT EXISTS` 语法,所以你需要将每个列的添加操作分开,并使用查询来检查列是否已经存在。你可以使用一个存储过程或一系列 SQL 语句来实现。以下是修改后的完整 SQL 语句示例:
-- 检查并添加 fuel 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `fuel` INT(10) DEFAULT ''100'';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'fuel');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 engine 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `engine` INT(10) DEFAULT ''1000'';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'engine');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 body 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `body` INT(10) DEFAULT ''1000'';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'body');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 damage 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `damage` LONGTEXT DEFAULT '''';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'damage');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 in_garage 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `in_garage` TINYINT(1) DEFAULT ''1'';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'in_garage');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 garage_id 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `garage_id` VARCHAR(255) DEFAULT ''Legion Square'';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'garage_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 job_vehicle 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `job_vehicle` TINYINT(1) DEFAULT ''0'';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'job_vehicle');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 job_vehicle_rank 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `job_vehicle_rank` INT(10) DEFAULT ''0'';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'job_vehicle_rank');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 gang_vehicle 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `gang_vehicle` TINYINT(1) DEFAULT ''0'';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'gang_vehicle');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 gang_vehicle_rank 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `gang_vehicle_rank` INT(10) DEFAULT ''0'';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'gang_vehicle_rank');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 impound 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `impound` INT(10) DEFAULT ''0'';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'impound');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 impound_retrievable 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `impound_retrievable` INT(10) DEFAULT ''0'';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'impound_retrievable');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 impound_data 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `impound_data` LONGTEXT DEFAULT '''';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'impound_data');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查并添加 nickname 列
SET @sql = (SELECT IF(
COUNT(*) = 0,
'ALTER TABLE `owned_vehicles` ADD COLUMN `nickname` VARCHAR(255) DEFAULT '''';',
'SELECT ''Column exists'';'
) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'owned_vehicles' AND COLUMN_NAME = 'nickname');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
请你逐个执行这些语句,确保所有新列都能正确添加。上述代码片段通过动态构建 SQL 语句来检查列的存在性,并相应地执行 `ALTER TABLE` 来添加列。 |