我的php文件中有一个ALTER TABLE
查询,其中表的名称基于$ name变量。
e.g。 $table = "Scores: ".$name;
我已将$table
变量替换为我的INSERT
语句,并验证它确实有效。
scores_name 表由整数字段(smallint)组成,当$POST
值为空时,插入表中的数字为0(显然默认情况下)。
但是,当满足某个条件时(在非空字段中),该特定行的值有意设置为0.
有些时候$POST
值应为空,因此我希望该特定行为空,因此当它插入为0而不是此时,这会引起明显的混淆。
以下是我的alter语句,共有5个游戏行,因此当该特定游戏的列为空时会触发此更改查询:
if($game1(empty))
{
$query = "ALTER TABLE `$table` MODIFY COLUMN `game1` SMALLINT DEFAULT NULL";
$result = mysql_query($query) or die (' ' . mysql_error() );
}
没有返回mysql错误,因此我假设ALTER
语句正确完成,但为什么它仍然插入0,尽管被修改为默认为NULL?
真的没有办法在基于整数的表中存储空值吗?
答案 0 :(得分:2)
考虑以下内容......
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table (id INT NOT NULL AUTO_INCREMENT PRiMARY KEY,x INT DEFAULT NULL);
INSERT INTO my_table (x) VALUES (0),(''),(' '),(NULL);
INSERT INTO my_table (id) VALUES (0),(''),(' '),(NULL);
INSERT INTO my_table VALUES (DEFAULT,DEFAULT);
SELECT * FROM my_table;
+----+------+
| id | x |
+----+------+
| 1 | 0 |
| 2 | 0 |
| 3 | 0 |
| 4 | NULL |
| 5 | NULL |
| 6 | NULL |
| 7 | NULL |
| 8 | NULL |
| 9 | NULL |
+----+------+
9 rows in set (0.00 sec)
答案 1 :(得分:1)
有时候$ POST值应为空,因此我希望该特定行为空,因此当它插入为0而不是此时,这会引起明显的混淆。 < / p>
使用该语句,我了解您不希望将值填充到列中,而是在列创建时定义的default
值。
将default
值插入列的可能方法是:
INSERT
时,请勿在查询中使用该列。IF
条件已满足,然后使用DEFAULT
代替值
对于有问题的专栏。 示例强>:
比如说,您的表定义如下:
create table tbl_so_q23869976( si smallint default null, col2 varchar(10) );
让我们看看,我们如何将默认值设置为si
列。
案例1 :一切顺利,然后:
$sql = "insert into tbl_so_q23869976( si, col2 ) values ( ?, ? )";
$stmt = $mysqli->prepare( @sql );
$stmt->bind_param( 'ds', 6, 'Ravin' ); // use proper variables in place of values
案例2.1 :如果某些内容不匹配,则:
/* use with 'default' to insert defaults */
$sql = "insert into tbl_so_q23869976( si, col2 ) values ( default, ? )";
$stmt = $mysqli->prepare( @sql );
$stmt->bind_param( 's', 'Ravin' ); // use proper variables in place of values
案例2.2 :如果某些内容不匹配,则:
/*just omit the column name into which you want to insert defaults */
$sql = "insert into tbl_so_q23869976( col2 ) values ( ? )";
$stmt = $mysqli->prepare( @sql );
$stmt->bind_param( 's', 'Ravin' ); // use proper variables in place of values