我试图在使用BEFORE的另一列之前向我的表添加一列,我不能使用AFTER,因为之前的列名不是常量。这就是我所拥有的:
ALTER TABLE testfyf ADD intake_10_2013 VARCHAR(20) NOT NULL BEFORE url;
直到BEFORE之前的所有事情都在发挥作用。
在有人对此发表任何言论之前,我知道以这种方式添加专栏不是一个好主意,但这是我老板想要的。
有谁知道我怎么能做到这一点?我发现很多例子说这应该有用,但事实并非如此。
答案 0 :(得分:5)
MySQL(如果这是mysql - 你只是标记它sql
一般而言)不支持BEFORE
关键字。您必须找到上一列的名称,并使用AFTER
添加它。
您可以使用此语句列出列名称,并使用PHP以编程方式确定您的新名称。
SHOW COLUMNS FROM tablename;
这是一个应该在'url'之前返回列的函数。我没有测试它,但我认为它可以完成这项工作。
// Queries the table column information and returns the column name just before `url`
function get_column_before_url() {
$result = mysql_query("SHOW COLUMNS FROM testfyf");
while ($row = mysql_fetch_array($result)) {
if ($row['Field'] == "url") {
// you should clean up your mysql resources before returning
mysql_free_result($result);
return $lastcol;
}
// Store the column name to return if the next one turns out to be `url`
else $lastcol = $row['Field'];
}
}
现在你可以做到:
$column_before = get_column_before_url();
$sql = "ALTER TABLE testfyf ADD intake_10_2013 VARCHAR(20) NOT NULL AFTER $column_before;";
$result = mysql_query($sql);
if (!$result) echo $mysql_error();
答案 1 :(得分:0)
您可以使用information_schema
按顺序获取表格的列:
SELECT c.COLUMN_NAME
, @n := @n + 1 AS column_id
FROM
( SELECT COLUMN_NAME
FROM information_schema.columns
WHERE TABLE_SCHEMA = 'yourDatabase'
AND TABLE_NAME = 'yourTable'
) AS c
CROSS JOIN
( SELECT @n := 0 ) AS v
如果您将上述内容加入其中,则可以获取上一列的名称,并将ADD COLUMN
与AFTER
一起使用。