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

insert mysql mysql-error-1093 sql
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')

…​I keep getting the following error:

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

また、2つの異なる顧客が同時に追加され、同じcustomer_idを持たないようにする方法を教えてください。

  36  8


ベストアンサー

INSERT …​ SELECTステートメントで `MAX()+ 1`値を取得し、同時に挿入します。

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

^ 注意: INSERT`から VALUES`を削除し、 SELECT`選択フィールドが INSERT`宣言フィールドと一致することを確認する必要があります。^

65


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

トランザクションを使用するのが最善の方法ですが、innodbテーブルを使用しない場合は、http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html [テーブルのロック]を実行してから実行するのが最善です。クエリ。 So:

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;

25


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

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

9


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

6


「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;

5


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

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

3


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

1


私の場合、約回答のどれもうまくいきません。 私はhttps://stackoverflow.com/questions/4429319/you-cant-specify-target-table-for-update-in-from-clause[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())
)

1


変数「a」を宣言します

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

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

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に更新されました。 したがって、これは良い例ではありません。

0


タイトルとURLをコピーしました