是否无法在另一列之前专门添加sql中的列?

时间:2011-06-29 13:25:34

标签: php mysql

我试图在使用BEFORE的另一列之前向我的表添加一列,我不能使用AFTER,因为之前的列名不是常量。这就是我所拥有的:

ALTER TABLE testfyf ADD intake_10_2013 VARCHAR(20) NOT NULL BEFORE url;

直到BEFORE之前的所有事情都在发挥作用。

在有人对此发表任何言论之前,我知道以这种方式添加专栏不是一个好主意,但这是我老板想要的。

有谁知道我怎么能做到这一点?我发现很多例子说这应该有用,但事实并非如此。

2 个答案:

答案 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 COLUMNAFTER一起使用。