[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.올바른, 당신은 수정 같은 쿼리에서 같은 테이블에서 선택할 수 없습니다. 당신은 두 개의 별도의 쿼리 위를 수행해야합니다.
올바른, 당신은 수정 같은 쿼리에서 같은 테이블에서 선택할 수 없습니다. 당신은 두 개의 별도의 쿼리 위를 수행해야합니다.
가장 좋은 방법은 트랜잭션을 사용하는 것입니다하지만 당신은 다음 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.당신은 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.이 같은 내부 쿼리에 대한 별칭 이름을 사용
이 같은 내부 쿼리에 대한 별칭 이름을 사용
INSERT INTO customers ( customer_id, firstname, surname ) VALUES ((SELECT MAX( customer_id )+1 FROM customers cust), 'sharath', 'rock')
-
==============================
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.
insert into table1(id1) select (max(id1)+1) from table1;
-
==============================
6.하위 쿼리를 사용하여 테이블 별칭 :
하위 쿼리를 사용하여 테이블 별칭 :
INSERT INTO customers ( customer_id, firstname, surname ) VALUES ((SELECT MAX( customer_id ) FROM customers C) +1, 'jim', 'sock')
-
==============================
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.단일 쿼리에서 그것을 할 수는 없지만, 당신은 트랜잭션 내에서 그것을 할 수 있습니다. 초기 MAX () 테이블을 선택하고 고정 마십시오, 다음 삽입을한다. 아무것도 두 개의 쿼리를 중단하지 않습니다 트랜잭션 보장하고, 아무 것도이 같은 시간에 다른 곳에서 같은 일을 시도 할 수있는 잠금 보장합니다.
단일 쿼리에서 그것을 할 수는 없지만, 당신은 트랜잭션 내에서 그것을 할 수 있습니다. 초기 MAX () 테이블을 선택하고 고정 마십시오, 다음 삽입을한다. 아무것도 두 개의 쿼리를 중단하지 않습니다 트랜잭션 보장하고, 아무 것도이 같은 시간에 다른 곳에서 같은 일을 시도 할 수있는 잠금 보장합니다.
-
==============================
9.우리는 변수 'A'를 선언
우리는 변수 'A'를 선언
SET **@a** = (SELECT MAX( customer_id ) FROM customers) +1; INSERT INTO customers ( customer_id, firstname, surname ) VALUES (**@a**, 'jim', 'sock')
-
==============================
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.이 속편 삽입 올를 선택한다.
이 속편 삽입 올를 선택한다.
나는 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.귀하의 하위 쿼리는 전부 그, 그냥 완전하지 않습니다. 내 중독에 아래의 쿼리를 참조하십시오 :
귀하의 하위 쿼리는 전부 그, 그냥 완전하지 않습니다. 내 중독에 아래의 쿼리를 참조하십시오 :
INSERT INTO customers ( customer_id, firstname, surname ) VALUES ((SELECT MAX( customer_id ) FROM customers) +1), 'jim', 'sock')
from https://stackoverflow.com/questions/5360117/insert-and-set-value-with-max1-problems by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 모든 열은 'X'가 들어 SQL 서버 SELECT (0) | 2020.06.04 |
---|---|
[SQL] 어떻게 PostgreSQL을 테이블에 행을 계산 속도를합니까? (0) | 2020.06.04 |
[SQL] JDBC 더비 드라이버를 찾을 수 없습니다 (0) | 2020.06.04 |
[SQL] Yii2와 액티브를 사용하여 실제 SQL 쿼리를 로그? (0) | 2020.06.04 |
[SQL] 어떻게 레코드를 삽입하고 하나의하는 SqlCommand를 사용하여 새로 생성 된 ID를 반환? (0) | 2020.06.04 |