2013-06-05 2 views
0

죄송합니다. 제목에서 설명하기가 어렵습니다. mysql insert insert in next 순서

는이 같은 간단한 테이블이 있습니다

CREATE TABLE `categories` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `title` varchar(125) NOT NULL, 
    `desc` text NOT NULL, 
    `ordering` int(10) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) 

ordering 열이 일반적으로 클라이언트가 끌어 이러한 범주를 재정렬 할 수있는 client--에 설정되어 있으므로이 auto_incremented되지 않습니다.

내 질문에 직접 SQL 삽입을 사용하여 클라이언트 외부에 행을 삽입 할 때 동일한 문에서 최대 ordering 열을 빠르게 얻을 수있는 방법이 있습니까? 같은

뭔가 : 나는 더 성공이 주제에 다스 변화를 시도했습니다

INSERT INTO `categories` (title, desc, ordering) 
VALUES ('test title', 'description', (SELECT max(ordering) FROM `categories`)+1); 

.

답변

2

일에 그 VALUES 절을 사용하지 말고, 대신 INSERT에 대한 행 원본으로 SELECT를 사용하는 것입니다 얻을 수있는 트릭 :

INSERT INTO `categories` (title, desc, ordering) 
SELECT 'test title', 'description', MAX(ordering)+1 FROM `categories` 

참고 : 동시 삽입을 허용하지 않는 MyISAM 테이블에서 작동합니다. 그러나 동시 INSERT를 허용하는 다른 엔진의 경우이 방법은 "설계 상 부숴 질"수 있습니다. 동시에 실행되는 두 INSERT 문이 순서 지정 열에 대해 동일한 값을 생성하지 않을 것이라는 보장이 없다고 생각합니다.

MAX (순서 지정)가 NULL을 반환하기 때문에이 디자인은 범주 테이블이 비어있을 때 "설계 상 부러기"도합니다. 그러나 IFNULL 함수로이를 수정할 수 있습니다.

SELECT 'test title', 'description', IFNULL(MAX(ordering),0)+1 FROM `categories` 
+0

우수! 정말 고마워. – julio

+0

@ julio :이 디자인에 대해주의해야합니다. – spencer7593

1

이 시도 :

일이 같은

insert into `categories` (`title`, `desc`, `ordering`) 
select 'test title','description', max(ordering) + 1 FROM `categories`