web-dev-qa-db-ja.com

max()+ 1の問題で値を挿入して設定する

新しい行を挿入して、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を持たないようにする方法を教えてください。

38
Cozzy

正しい、同じクエリ内の同じテーブルから変更して選択することはできません。上記の2つの個別のクエリで実行する必要があります。

最良の方法はトランザクションを使用することですが、innodbテーブルを使用しない場合は、 テーブルをロックする にしてからクエリを実行するのが最善です。そう:

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;
26
RDL

_INSERT ... SELECT_ ステートメントを使用して、MAX()+1値を取得し、同時に挿入できます。

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

注:VALUESからINSERTを削除し、SELECTが選択されていることを確認する必要がありますフィールドは、INSERTで宣言されたフィールドと一致します。

72
EmCo

このように内部クエリにエイリアス名を使用します

INSERT INTO customers
  ( customer_id, firstname, surname )
VALUES 
  ((SELECT MAX( customer_id )+1 FROM customers cust), 'sharath', 'rock')
10
Sharath Nadig
insert into table1(id1) select (max(id1)+1) from table1;
6
test

SELECT MAX(col) +1は安全ではありません。同じテーブルまたは他のテーブルから選択するかどうかに関係なく、同じcustomer_id値を持つ複数の顧客を挿入しないことを保証しません。 MySQLのテーブルへの挿入時に一意の整数値が割り当てられるようにする適切な方法は、AUTO_INCREMENTを使用することです 。 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;
6
OMG Ponies

サブクエリでテーブルエイリアスを使用します。

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

私の場合、約回答のどれもうまくいきません。 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())
)
2
zipper

単一のクエリで実行することはできませんが、トランザクション内で実行することはできます。最初のMAX()を実行してテーブルを選択してロックしてから、挿入を実行します。トランザクションは、2つのクエリを中断するものがないことを保証し、ロックは、他の誰かが同じ場所で同時に同じことを試みることができないことを保証します。

1
Marc B

これは、続編の挿入を選択します。

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);
0
kani sindhu

変数「a」を宣言します

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

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

私のものは挿入物ですが、ここに私がここで提案を使用することになったものがあります。

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'

編集-これは実際には機能しませんでした。それを選択ステートメントに変えるとうまくいくように見えるので、なぜそうなのかはわかりませんが、これはすべてのHost_idを同じIDに更新しました。したがって、これは良い例ではありません。

0
silverbow25