如何在不指定非自动增量主键的值的情况下插入数据?

时间:2009-11-12 22:15:52

标签: mysql insert

我有这张桌子:

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.   
  3. 插入人物值(null,'John','Smith','LA','LA');
  4.   
  5. 插入人物价值(汽车,'约翰','史密斯','洛杉矶','洛杉矶');
  6.   

但没有运气

4 个答案:

答案 0 :(得分:6)

主键不能为空,如果你没有将它们设置为自动增量,那么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');

这使用了一个subselect,所以如果你使用的是旧版本的MySQL,它可能无效。

答案 1 :(得分:0)

我已经看到这实现为

  • PK列上的DEFAULT值(比如-9999)
  • 包含Current_PK值的表
  • INSERT触发器,将PK从-9999更改为Current_PK并递增Current_PK

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

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

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

答案 2 :(得分:0)

 Select p_id+1 From Person OrderBy p_id desc limit 1;

答案 3 :(得分:0)

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

我很想知道为什么有人会想要在不使用自动增量的情况下使用主键。自动增量是避免在任何表中避免重复数据的最优雅方式。如果其余数据与该表中的另一行相同,则可以识别并修复/删除该数据。与另一行(这是一个唯一的密钥)结合使用时,表变得非常健壮。

ianm