插入并设置max()+ 1个问题的值

时间:2011-03-19 04:38:08

标签: mysql sql insert mysql-error-1093

我正在尝试插入一个新行,并将customer_id设置为max()+ 1。原因是该表已经在另一个名为id的列上具有auto_increatment,并且该表将具有多个具有相同customer_id的行。

有了这个:

INSERT INTO customers
  ( customer_id, firstname, surname )
VALUES 
  ((SELECT MAX( customer_id ) FROM customers) +1, 'jim', 'sock')

...我一直收到以下错误:

#1093 - You can't specify target table 'customers' for update in FROM clause

另外,我如何阻止同时添加2个不同的客户而没有相同的customer_id?

12 个答案:

答案 0 :(得分:69)

您可以使用INSERT ... SELECT语句获取MAX()+1值并同时插入:

INSERT INTO 
customers( customer_id, firstname, surname )
SELECT MAX( customer_id ) + 1, 'jim', 'sock' FROM customers;

注意:您需要从VALUES中删除INSERT,并确保SELECT个选定字段与INSERT匹配声明的字段。

答案 1 :(得分:25)

正确,您无法在同一查询中修改和选择同一个表。您必须在两个单独的查询中执行上述操作。

最好的方法是使用交易,但如果你没有使用innodb表,那么接下来最好的是locking the tables然后执行你的查询。所以:

Lock tables customers write;

$max = SELECT MAX( customer_id ) FROM customers;

获取最大ID,然后执行插入

INSERT INTO customers( customer_id, firstname, surname )
VALUES ($max+1 , 'jim', 'sock')

unlock tables;

答案 2 :(得分:10)

使用内部查询的别名如此

INSERT INTO customers
  ( customer_id, firstname, surname )
VALUES 
  ((SELECT MAX( customer_id )+1 FROM customers cust), 'sharath', 'rock')

答案 3 :(得分:6)

insert into table1(id1) select (max(id1)+1) from table1;

答案 4 :(得分:5)

SELECT MAX(col) +1不安全 - 它无法确保您不会插入具有相同customer_id值的多个客户,无论是从同一表还是其他表中选择。 proper way to ensure a unique integer value is assigned on insertion into your table in MySQL is to use AUTO_INCREMENT。{{3}}。 ANSI标准是使用序列,但MySQL不支持它们。 AUTO_INCREMENT列只能在CREATE TABLE语句中定义:

CREATE TABLE `customers` (
  `customer_id` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(45) DEFAULT NULL,
  `surname` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`customer_id`)
)

那就是说,5.1.49这个对我很好:

CREATE TABLE `customers` (
  `customer_id` int(11) NOT NULL DEFAULT '0',
  `firstname` varchar(45) DEFAULT NULL,
  `surname` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`customer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$

INSERT INTO customers VALUES (1, 'a', 'b');

INSERT INTO customers 
SELECT MAX(customer_id) + 1, 'jim', 'sock'
  FROM CUSTOMERS;

答案 5 :(得分:3)

在子查询中使用表别名:

INSERT INTO customers
  ( customer_id, firstname, surname )
VALUES 
  ((SELECT MAX( customer_id ) FROM customers C) +1, 'jim', 'sock')

答案 6 :(得分:2)

这些答案都不适用于我的案例。我从here得到了答案,我的SQL是:

INSERT INTO product (id, catalog_id, status_id, name, measure_unit_id, description, create_time)
VALUES (
  (SELECT id FROM (SELECT COALESCE(MAX(id),0)+1 AS id FROM product) AS temp),
  (SELECT id FROM product_catalog WHERE name="AppSys1"),
  (SELECT id FROM product_status WHERE name ="active"),
  "prod_name_x",
  (SELECT id FROM measure_unit WHERE name ="unit"),
  "prod_description_y",
  UNIX_TIMESTAMP(NOW())
)

答案 7 :(得分:1)

您无法在单个查询中执行此操作,但您可以在事务中执行此操作。初始MAX()选择并锁定表,然后执行插入。该事务确保没有任何东西会中断这两个查询,并且锁定确保没有其他任何东西可以尝试同时在其他地方做同样的事情。

答案 8 :(得分:0)

我们声明变量'a'

SET **@a** = (SELECT MAX( customer_id ) FROM customers) +1;

INSERT INTO customers
  ( customer_id, firstname, surname )
VALUES 
  (**@a**, 'jim', 'sock')

答案 9 :(得分:0)

我是一个插入,但这是我最终使用这里的建议。

update
   m
set
   m.host_id = max(h.host_id)
from
   t_po_master as m
   inner join t_al_host_po_master as h on m.po_number = h.po_number
where
   m.host_id is NULL
   and m.client_code = '01'

编辑 - 这实际上并没有奏效。我不确定为什么不这样做,因为将它转换为select语句似乎可以工作,但是这会将所有host_id更新为相同的id。所以我不会用这个就是一个很好的例子。

答案 10 :(得分:0)

这是精选的续集。

我正在尝试获取serial_no最大+1值及其正确的值。

SELECT MAX(serial_no)+1 into @var FROM sample.kettle;
Insert into kettle(serial_no,name,age,salary) values (@var,'aaa',23,2000);

答案 11 :(得分:0)

您的子查询只是不完整,仅此而已。请参阅以下有关我的瘾的查询:

INSERT INTO customers ( customer_id, firstname, surname ) 
VALUES ((SELECT MAX( customer_id ) FROM customers) +1), 'jim', 'sock')