【问题标题】:How can I insert data without specifying a value for a non auto-increment primary key?如何在不为非自增主键指定值的情况下插入数据?
【发布时间】:2010-12-16 02:19:02
【问题描述】:

我有这张桌子:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)


1. insert into persons values (1, 'John', 'Smith', 'LA', 'LA');
2. insert into persons (p_id, lastname, firstname, address, city) values  (2, 'John', 'Smith', 'LV', 'LV');

如何在不指定主键值的情况下将数据插入表中(主键没有“auto_increment”属性)。

我试过了:

  1. 插入个人值('John'、'Smith'、'LA'、'LA');
  2. 插入个人值(null、'John'、'Smith'、'LA'、'LA');
  3. 插入个人值(auto、'John'、'Smith'、'LA'、'LA');

但没有运气

【问题讨论】:

    标签: mysql insert


    【解决方案1】:

    主键不能为空,如果你不设置它们为自增,那么MySQL怎么知道你要往表里放什么?您需要指定 ID(可能通过选择 MAX(P_Id) 并向其添加 1)或将其设置为自动递增。

    虽然简单地添加一个自动增量字段绝对是最好的方法,但您可以尝试这样的方法:

    INSERT INTO Persons (P_Id, FirstName, LastName, Address, City)
    VALUES ((SELECT MAX(P_Id) + 1 FROM Persons), 'John', 'Smith', 'LA', 'LA');
    

    这使用了一个子选择,所以如果您使用的是旧版本的 MySQL,它可能无法正常工作。

    【讨论】:

      【解决方案2】:

      我已经看到这个实现了

      • PK 列的默认值(例如 -9999)
      • 保存 Current_PK 值的表
      • 将 PK 从 -9999 更改为 Current_PK 并递增 Current_PK 的 INSERT 触发器

      我看到的另一种方法是从表中获取 MAX 并将其递增并将其放入新行中。

      我必须说,这两种方法都会导致错误的数据,导致锁定和阻塞以及性能下降。

      在您的情况下,除了实际为 PK 指定值之外,我没有看到其他方法。

      【讨论】:

      • 在我工作的地方,我们有一个包含这些主键(tablename、nextkey)元组的表。有一天,有人进行了一次更新,打算更新一个键的值,但运行查询时忘记了 WHERE 子句。可以说花了几个小时才把事情理顺!
      【解决方案3】:
       Select p_id+1 From Person OrderBy p_id desc limit 1;
      

      【讨论】:

        【解决方案4】:

        当使用自动增量将行加载到表中时,您可以指定一个值,前提是该值不小于该键中的最大值。这与 UNIQUE 键的工作方式相同,并且会像重复一样出错。否则,它将新加载的值视为该键的新最高值。

        我很想知道为什么有人想使用主键而不使用自动增量。自动增量为避免任何表中的重复数据提供了一种最优雅的方式。如果其余数据与该表中的另一行相同,则可以对其进行识别和修复/删除。与作为唯一键的另一行结合使用(以捕获任何重复项),该表变得非常健壮。

        安姆

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-11-30
          • 1970-01-01
          • 2012-12-14
          • 2014-10-03
          • 2016-12-12
          • 2010-11-06
          • 1970-01-01
          相关资源
          最近更新 更多