【问题标题】:Does MySQL Insert allow not specifying all fields?MySQL Insert 是否允许不指定所有字段?
【发布时间】:2013-02-08 19:47:46
【问题描述】:

我有两个 mysql 插入语句。在插入语句中指定的所有字段都可以正常工作并将记录插入到 testTable。(即使 http_referer 为空,插入语句也会将记录插入到引用字段为空的表中)

指定所有字段的第一个插入语句:

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

问题在于第二个插入语句没有向 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 ;

【问题讨论】:

  • 对于任何遇到这个问题的人,因为他们想知道insert testTable () values (); 是否有效......它是(只要所有字段都有默认值):sqlfiddle.com/#!9/163e74/1

标签: php mysql database


【解决方案1】:

是的,通过使用列列表。

$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,并使用 PDOMySQLi - this article 将帮助您决定哪个。

【讨论】:

  • 感谢您的回复。所以你的意思是我需要指定在尝试省略任何列时要插入的列名,当尝试插入所有列时,我不需要在插入语句中指定列名?
  • @user1788736 正确。可以从列列表中省略具有默认值(NULLAUTO INCREMENT 或其他)的列。
  • 谢谢大家。我忘记了在插入语句中省略任何字段时需要指定字段。现在我知道在省略任何列时我需要在插入语句中指定我想要的列!
  • @user1788736 除非您的表结构永远不会改变,否则您应该始终指定一个列列表。
【解决方案2】:

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

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

另外,请不要使用mysql 函数,因为它们现在已被弃用。使用MySQLi,或PDO

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      列列表:

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

      SET 语法:

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

      【讨论】:

        【解决方案5】:

        在第一个查询中不会出现错误,因为您指定了所有列和字段。如果任何字段是自动递增或默认为 null,您应该提及所有列名以及插入查询中的值,接受自动递增字段的 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");
          

        【讨论】:

          猜你喜欢
          • 2017-11-18
          • 2015-12-30
          • 2020-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-16
          • 2015-07-22
          • 2021-12-13
          相关资源
          最近更新 更多