복붙노트

[SQL] 삽입 등) (최대 + 1 문제 설정치

SQL

삽입 등) (최대 + 1 문제 설정치

나는 새 행을 삽입하고 최대 () + 1과 CUSTOMER_ID을 설정하려합니다. 그 이유는 이미 테이블 다른 열 이름 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

또한 어떻게이 명 다른 고객이 동시에 추가와 같은 CUSTOMER_ID을 가지고 있지 그만 것?

해결법

  1. ==============================

    1.올바른, 당신은 수정 같은 쿼리에서 같은 테이블에서 선택할 수 없습니다. 당신은 두 개의 별도의 쿼리 위를 수행해야합니다.

    올바른, 당신은 수정 같은 쿼리에서 같은 테이블에서 선택할 수 없습니다. 당신은 두 개의 별도의 쿼리 위를 수행해야합니다.

    가장 좋은 방법은 트랜잭션을 사용하는 것입니다하지만 당신은 다음 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;
    
  2. ==============================

    2.당신은 MAX ()를 동시에 + 1 값과 삽입을 얻기 위해 INSERT ... SELECT 문을 사용할 수 있습니다 :

    당신은 MAX ()를 동시에 + 1 값과 삽입을 얻기 위해 INSERT ... SELECT 문을 사용할 수 있습니다 :

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

    참고 : 당신은 당신의 INSERT의 값을 드롭해야하고 SELECT이 필드는 INSERT가 필드를 선언 맞게 선택해야합니다.

  3. ==============================

    3.이 같은 내부 쿼리에 대한 별칭 이름을 사용

    이 같은 내부 쿼리에 대한 별칭 이름을 사용

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

    4.SELECT MAX (골) +1 안전하지 않습니다 - 당신이 상관없이 같은 테이블 또는 다른 사람을 선택하는 경우, 같은 CUSTOMER_ID 값 이상의 고객이 삽입되지 않도록하지 않습니다. 고유 한 정수 값을 보장하기 위해 적절한 방법은 MySQL은 테이블에 삽입시 할당은 AUTO_INCREMENT를 사용하는 것입니다. ANSI 표준은 사용 시퀀스이지만, MySQL은이를 지원하지 않습니다. AUTO_INCREMENT 컬럼은 CREATE TABLE 문에서 정의 할 수 있습니다 :

    SELECT MAX (골) +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. ==============================

    5.

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

    6.하위 쿼리를 사용하여 테이블 별칭 :

    하위 쿼리를 사용하여 테이블 별칭 :

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

    7.[정보 답변 중에 내 경우에 작동하지 않습니다. 여기에서 답을 얻고, 내 SQL은 다음과 같습니다

    [정보 답변 중에 내 경우에 작동하지 않습니다. 여기에서 답을 얻고, 내 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())
    )
    
  8. ==============================

    8.단일 쿼리에서 그것을 할 수는 없지만, 당신은 트랜잭션 내에서 그것을 할 수 있습니다. 초기 MAX () 테이블을 선택하고 고정 마십시오, 다음 삽입을한다. 아무것도 두 개의 쿼리를 중단하지 않습니다 트랜잭션 보장하고, 아무 것도이 같은 시간에 다른 곳에서 같은 일을 시도 할 수있는 잠금 보장합니다.

    단일 쿼리에서 그것을 할 수는 없지만, 당신은 트랜잭션 내에서 그것을 할 수 있습니다. 초기 MAX () 테이블을 선택하고 고정 마십시오, 다음 삽입을한다. 아무것도 두 개의 쿼리를 중단하지 않습니다 트랜잭션 보장하고, 아무 것도이 같은 시간에 다른 곳에서 같은 일을 시도 할 수있는 잠금 보장합니다.

  9. ==============================

    9.우리는 변수 'A'를 선언

    우리는 변수 'A'를 선언

    SET **@a** = (SELECT MAX( customer_id ) FROM customers) +1;
    
    INSERT INTO customers
      ( customer_id, firstname, surname )
    VALUES 
      (**@a**, 'jim', 'sock')
    
  10. ==============================

    10.광산 삽입이지만, 여기에 내가 여기에 제안을 사용하여 결국 것입니다.

    광산 삽입이지만, 여기에 내가 여기에 제안을 사용하여 결국 것입니다.

    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 문으로 돌려 때문에 작동 것으로 나타나지만이 동일한 ID로 모든 host_ids를 업데이트하는 이유는 확실하지 않다. 내가 사용하지 않을 그래서이 좋은 예이다.

  11. ==============================

    11.이 속편 삽입 올를 선택한다.

    이 속편 삽입 올를 선택한다.

    나는 serial_no 최대 한 값과주고 정확한 값을 얻기 위해 노력하고 있어요.

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

    12.귀하의 하위 쿼리는 전부 그, 그냥 완전하지 않습니다. 내 중독에 아래의 쿼리를 참조하십시오 :

    귀하의 하위 쿼리는 전부 그, 그냥 완전하지 않습니다. 내 중독에 아래의 쿼리를 참조하십시오 :

    INSERT INTO customers ( customer_id, firstname, surname ) 
    VALUES ((SELECT MAX( customer_id ) FROM customers) +1), 'jim', 'sock')
    
  13. from https://stackoverflow.com/questions/5360117/insert-and-set-value-with-max1-problems by cc-by-sa and MIT license