如何在不删除行或记录的情况下重命名和删除mysql列名?

时间:2016-12-07 21:04:07

标签: php mysql

无论我尝试什么,在重命名或删除列之后,表的所有记录都会被删除。我做错了什么?

以下是重命名列名尝试(每次尝试同时执行2列):

//method 1 (doesn't work)
ALTER TABLE products_jobs CHANGE COLUMN ".$old_name." ".$new_name." VARCHAR(255) NOT NULL, CHANGE COLUMN ".$old_price." ".$new_price." VARCHAR(255) NOT NULL;

//method 2 (doesn't work)
ALTER TABLE products_jobs MODIFY COLUMN ".$old_name." ".$new_name." VARCHAR(255) NOT NULL, MODIFY COLUMN ".$old_price." ".$new_price." VARCHAR(255) NOT NULL;

//method 3 (doesn't work)
ALTER TABLE products_jobs ADD ".$new_name." VARCHAR(255) NOT NULL AFTER qty;
UPDATE products_jobs SET ".$new_name." = CASE WHEN ".$old_name." THEN 1 ELSE 0 END;
ALTER TABLE products_jobs DROP COLUMN ".$old_name.";
ALTER TABLE products_jobs ADD ".$new_price." VARCHAR(255) NOT NULL AFTER qty;
UPDATE products_jobs SET ".$new_price." = CASE WHEN ".$old_price." THEN 1 ELSE 0 END;
ALTER TABLE products_jobs DROP COLUMN ".$old_price.";

//method 4 (doesn't work)
ALTER TABLE products_jobs ADD ".$new_price." VARCHAR(255) NOT NULL AFTER qty, ADD ".$new_name." VARCHAR(255) NOT NULL AFTER qty;
UPDATE products_jobs set ".$new_price." = ".$old_price.", ".$new_name." = ".$old_name.";
ALTER TABLE products_jobs DROP COLUMN ".$old_price.", DROP COLUMN ".$old_name.";

这是我试过的删除方法。不知道怎么写这个,所以我没有尝试过这种方式。而且,它同时做了两列。

ALTER TABLE products_jobs DROP COLUMN ".$old_name.", DROP COLUMN ".$old_price.";

因此所有这些都可以在重命名和删除列时使用,但问题是表的所有记录都被删除了,这并不好。需要我的所有行/记录保持不变。不确定这是否重要,但表类型/引擎是innodb,而不是myisam。

更新

我发现我在那里有额外的代码,它引用了错误的数据库。数据库变量不正确。一旦我纠正了它,上面的问题就消失了。这是代码搞砸了我。

$sql = mysql_query("SELECT COUNT(*) totalColumns FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '".$database."' AND table_name = 'products_jobs'");
$row = mysql_fetch_assoc($sql);
$totalcolumns = $row['totalColumns'];
if ($totalcolumns < 4) {
    $sql = mysql_query("DELETE FROM products_jobs");
}

2 个答案:

答案 0 :(得分:2)

根据MySQL手册:

ALTER TABLE t1 CHANGE a b INTEGER

“您可以使用CHANGE old_col_name new_col_name column_definition子句重命名列。为此,请指定旧列名称和新列名称以及列当前具有的定义。”

来源:http://dev.mysql.com/doc/refman/5.7/en/alter-table.html

所以,在你的情况下

ALTER TABLE products_jobs CHANGE ".$old_name." ".$new_name . " VARCHAR(255)"

请注意,您的SQL容易受到SQL注入攻击。

答案 1 :(得分:2)

我认为可能导致您之前尝试失败的原因是“非空”&#39;描述。我引用了您对类似问题的答案:https://stackoverflow.com/a/5706625/6622781