MySQL插入是否允许不指定所有字段?

时间:2013-02-08 19:47:46

标签: php mysql database

我有两个mysql插入语句。具有insert语句中指定的所有字段的那个工作正常并且将记录插入到testTable。(即使当http_referer为空时,insert语句也会将记录插入到带有referer字段为空的表中)

包含所有指定字段的第一个Insert语句:

mysql_query("INSERT INTO testTable VALUES('$ID','".$_SERVER['REMOTE_ADDR']."',NOW(),'Page1','".$_SERVER['HTTP_REFERER']."')");

问题在于第二个insert语句没有向testTable插入任何记录! 你能告诉我为什么我的第二个插入语句没有向testTable插入任何记录吗?

第二次插入法规:

mysql_query("INSERT INTO testTable VALUES('$ID','".$_SERVER['REMOTE_ADDR']."',NOW(),'Page1')");

创建表:

CREATE TABLE IF NOT EXISTS `testTable` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `ip` varchar(32) DEFAULT NULL,
  `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `Title` varchar(32) NOT NULL,
  `Ref` varchar(250) NULL default '',
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1784 ;

5 个答案:

答案 0 :(得分:5)

是的,使用列表。

$sql = "INSERT INTO table (`ip`, `date`, `Title`) VALUES ('".$_SERVER['REMOTE_ADDR']."', NOW(), 'Page 1')";

Please, don't use mysql_* functions in new code。它们不再被维护and are officially deprecated。请参阅red box?请改为了解prepared statements,并使用PDO,或MySQLi - this article将帮助您确定哪个。

答案 1 :(得分:3)

您可以选择在insert语句中指定要插入的列。

$sql = "INSERT INTO testTable(ID, ip, date, Title)
VALUES('$ID','".$_SERVER['REMOTE_ADDR']."',NOW(),'Page1')";

此外,请不要使用mysql函数,因为它们现已弃用。使用MySQLiPDO

答案 2 :(得分:2)

您必须使用第二个查询指定字段。如果您不打算按列的顺序插入每一列,则必须指定列名。

INSERT INTO table (column1, column2, columns3) VALUES ('$value1', '$value2', '$value3');

答案 3 :(得分:0)

您可以使用列列表或SET语法

列列表:

INSERT INTO table (column1, column2) VALUES ('$value1', '$value2');

SET语法:

INSERT INTO table SET column1 = '$value1', column2 = '$value2';

答案 4 :(得分:0)

在第一个查询错误中,因为您指定了所有列并且已经fieleds.If任何字段都是自动增量或默认为null,您应该提及所有列名称以及插入查询中的值接受自动增量字段的空值

这是

的演示
  1. 所有字段值

    insert into testtable values (1,"127.1.1.0",curdate(),"test 1","default");
    
  2. 没有默认值

    insert into testtable (id,ip,date,title) values (1,"127.1.1.0",curdate(),"test 1");
    
  3. 没有自动增量字段

    insert into testtable (ip,date,title) values ("127.1.1.0",curdate(),"test 1");