如何在MYSQL表中添加新列?

114

我正在尝试使用PHP向我的MYSQL表格添加一个新列。我不确定如何修改我的表格,以便创建新列。在我的评估表中,我有:

assessmentid | q1 | q2 | q3 | q4 | q5 

假设我有一个带有文本框的页面,我在文本框中输入q6并按下按钮,那么表格将会被更新为:

assessmentid | q1 | q2 | q3 | q4 | q5 | q6

我的代码:

<?php 
  mysql_query("ALTER TABLE `assessment` ADD newq INT(1) NOT NULL AFTER `q10`");
?>
  <form method="post" action="">
    <input type="text" name="newq" size="20">
    <input type="submit" name="submit" value="Submit">

3
RTLM: http://dev.mysql.com/doc/refman/5.1/en/alter-table.htmlRTLM:http://dev.mysql.com/doc/refman/5.1/en/alter-table.html该链接是有关MySQL ALTER TABLE语句的文档。ALTER TABLE语句用于修改现有表的结构,例如添加或删除列,更改列的数据类型或名称,以及设置约束和索引等。该文档提供了ALTER TABLE语句的各种选项和使用方法的详细说明。 - Marc B
我不确定如何表达我的问题,我有这个代码但它无法运行。$sql=mysql_query("SELECT * FROM assessment");if (!$sql){mysql_query("ALTER TABLE assessment ADD q6 INT(1) NOT NULL AFTER q5");echo 'Q6已创建';}ELSE{//从这里继续页面的正常操作!echo 'Q6已存在!'; - Steven Trainor
1
@StevenTrainor 的评论不是代码的最佳放置地点。如果您想展示您遇到问题的源代码,应将其作为问题的一部分。您能否编辑您的问题以包含源代码? - Nick Freeman
糟糕的代码。mysql_query在任何失败时都会返回布尔值false,而不仅仅是在尝试添加重复字段时。始终检查mysql_error()以查看出了什么问题。例如:$result = mysql_query($sql) or die(mysql_error()); - Marc B
这个问题与PHP有什么关系? - Kellen Stuart
9个回答

260

你的表格:

q1 | q2 | q3 | q4 | q5

你也可以这样做

ALTER TABLE yourtable ADD q6 VARCHAR( 255 ) after q5

2
谢谢,它可以使用 - mysql_query("ALTER TABLE assessment ADD q6 INT(1) NOT NULL AFTER q5"); - Steven Trainor
1
提交后,文本框的值应该在 $_POST['newq'] 中。 - Dima
11
不要直接在SQL语句中使用文本框中的字符串,必须对其进行转义以避免发生SQL注入漏洞。 - Costi Ciudatu
3
现在是2015年,仍有人试图设置自己的应用程序存在SQL注入漏洞——:facepalm: - CommandZ
我在一个循环中使用这个命令,该循环针对一个包含列名的数组。但是只有第一列被创建了,尽管数组已经填满了。你有什么想法我做错了什么吗?我本可以提出一个新问题,但首先想在这里检查一下。非常感谢。 - nooshinha
显示剩余5条评论

10
 $table  = 'your table name';
 $column = 'q6'
 $add = mysql_query("ALTER TABLE $table ADD $column VARCHAR( 255 ) NOT NULL");

您可以将 VARCHAR( 255 ) NOT NULL 更改为任何您想要的 数据类型


明白了,谢谢。我该如何将列命名为文本框中输入的任意名称? - Steven Trainor
1
@StevenTrainor 你所说的 textbox 是什么意思?如果你指的是一个 input,它的 type='text',那么写成 $column = $_POST['textbox']; - Abdullah Salma
@StevenTrainor 首先,您需要将输入命名为 name='textbox' 或者将 $column = $_POST['textbox']; 中的 textbox 更改为输入的名称... - Abdullah Salma

9
  • 您可以在表的末尾添加新列

    ALTER TABLE assessment ADD q6 VARCHAR( 255 )

  • 在表的开头添加列

    ALTER TABLE assessment ADD q6 VARCHAR( 255 ) FIRST

  • 在指定列旁边添加列

    ALTER TABLE assessment ADD q6 VARCHAR( 255 ) after q5

更多选项请参考这里


4

Something like:

$db = mysqli_connect("localhost", "user", "password", "database");
$name = $db->mysqli_real_escape_string($name);
$query = 'ALTER TABLE assesment ADD ' . $name . ' TINYINT NOT NULL DEFAULT \'0\'';
if($db->query($query)) {
    echo "It worked";
}

尚未测试,但应该可以正常工作。

谢谢 - 我怎样才能将列命名为我在文本框中输入的任何名称? - Steven Trainor
用以下代码替换我的$name赋值语句:$name = $db->mysqli_real_escape_string($_GET['input']);,假设您正常提交表单。如果使用Ajax,则稍微复杂一些。 - Glitch Desire

2

为避免在运行时创建列,您应该考虑对数据库进行规范化。

创建3个表:

  1. 评估(assessment)
  2. 问题(question)
  3. 评估问题(assessment_question),包含列:assessmentId、questionId

将问题和评估分别放入它们各自的表中,并使用外键通过assessment_question将它们链接在一起。


1

对于WORDPRESS:

global $wpdb;


$your_table  = $wpdb->prefix. 'My_Table_Name';
$your_column =                'My_Column_Name'; 

if (!in_array($your_column, $wpdb->get_col( "DESC " . $your_table, 0 ) )){  $result= $wpdb->query(
    "ALTER     TABLE $your_table     ADD $your_column     VARCHAR(100)     CHARACTER SET utf8     NOT NULL     "  //you can add positioning phraze: "AFTER My_another_column"
);}

1
ALTER TABLE `stor` ADD `buy_price` INT(20) NOT NULL ;

1
根据您的评论,看起来您只有在mysql_query("SELECT * FROM assessment");返回false时才添加新列。这可能不是您想要的。尝试在第一个'if'语句中删除$sql前面的'!'。因此,您的代码将如下所示:
$sql=mysql_query("SELECT * FROM assessment");
if ($sql) {
 mysql_query("ALTER TABLE assessment ADD q6 INT(1) NOT NULL AFTER q5");
 echo 'Q6 created'; 
}else...

0

PHP代码中ALTER TABLE的问题在于这一行:

mysql_query("ALTER TABLE assessment ADD newq INT(1) NOT NULL AFTER q10");

应该是AFTER q5,因为您的表样本中没有q10。所以它变成了 ALTER TABLE assessment ADD newq INT(1) NOT NULL AFTER q5;

我在[ Skyvia ]中尝试了相同的逻辑,并且应该像下面这样工作。 我在Title表中的To列后添加了描述列。

[Skyvia] - https://skyvia.com/query/online-mysql-query-builder的链接

[image alter-table-add-column]enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接