【问题标题】:How do I rename and delete mysql column names without deleting rows or records?如何在不删除行或记录的情况下重命名和删除 mysql 列名?
【发布时间】:2017-04-22 23:30:21
【问题描述】:

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

这里是重命名列名的尝试(每次尝试同时做 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.";

这是我试过的删除方法。不知道这还能怎么写,所以我没有尝试更多这种方式。同样,它同时处理 2 列。

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");
}

【问题讨论】:

  • 那些php变量的值是什么?这些语句都不应该删除任何行,除非您正在注入 sql。
  • 它们可以是很多不同的东西,但一个例子是 Variable_List_name 是名称之一,Variable_List_price 是价格之一。
  • 可能是外键
  • 想通了,这与alter语句的编写方式无关。这是我错了的额外代码。将更新帖子进行解释。

标签: php mysql


【解决方案1】:

我认为可能导致您之前的尝试失败的是“NOT NULL”描述符。我建议您参考这个类似问题的答案:https://stackoverflow.com/a/5706625/6622781

【讨论】:

  • 没有用,但我发现了我的错误,这是让我感到困惑的额外代码。
【解决方案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 注入的攻击。

【讨论】:

  • 除非他将变量作为用户输入,否则它不会受到攻击,这是你不知道的。
  • 没有用,但我发现了我的错误,这是让我感到困惑的额外代码。
猜你喜欢
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2011-04-11
  • 2014-09-01
  • 2013-08-06
  • 2012-09-18
  • 2013-07-27
  • 1970-01-01
相关资源
最近更新 更多