[SQL] MySQL의에서 다음 사용 가능한 ID를 찾기
SQLMySQL의에서 다음 사용 가능한 ID를 찾기
내가 MySQL 데이터베이스에서 (데이터베이스 (5 개) 데이터가있는 경우, 내가 6 인 사용 가능한 다음 삽입 위치를 얻을 수 있습니다) 다음 사용 가능한 ID를 찾을 수있다. 내가 어떻게 할 수 있습니까? 나는 MAX (ID)를 사용했다,하지만 난 데이터베이스에서 일부 행을 삭제할 때, 그것은 여전히 업데이트되지 않은 이전의 최대 값을 보유하고 있습니다.
해결법
-
==============================
1.누군가가 당신이 다음 ID를 요청 직후에 새로운 행을 삽입 할 수 있기 때문에 나는 당신이 이제까지 다음 ID에 확신 할 수 있다고 생각하지 않습니다. 당신은 적어도 거래를해야하고, 내가 잘못 아니에요 경우에만 그것을 처리하는 일반적인 방법은 적어도 그것을 삽입 한 후 사용되는 실제 ID를 얻을 수 있습니다 - 참조 http://dev.mysql.com/ 문서 / 그러면, refman / 5.0 / EN / 점점 고유-id.html
누군가가 당신이 다음 ID를 요청 직후에 새로운 행을 삽입 할 수 있기 때문에 나는 당신이 이제까지 다음 ID에 확신 할 수 있다고 생각하지 않습니다. 당신은 적어도 거래를해야하고, 내가 잘못 아니에요 경우에만 그것을 처리하는 일반적인 방법은 적어도 그것을 삽입 한 후 사용되는 실제 ID를 얻을 수 있습니다 - 참조 http://dev.mysql.com/ 문서 / 그러면, refman / 5.0 / EN / 점점 고유-id.html
-
==============================
2.업데이트 2014년 12월 5일 : 나는 때문에 사이먼의 (가능) 대답뿐만 아니라 샌디에고의 코멘트에 배치 이유로이 방법을 추천하고 있지 않다. 책임 아래 쿼리를 사용하십시오.
업데이트 2014년 12월 5일 : 나는 때문에 사이먼의 (가능) 대답뿐만 아니라 샌디에고의 코멘트에 배치 이유로이 방법을 추천하고 있지 않다. 책임 아래 쿼리를 사용하십시오.
내가 MySQL의 개발자 사이트에서 발견 가장 짧은 하나
SELECT Auto_increment FROM information_schema.tables WHERE table_name='the_table_you_want'
당신은 같은 테이블에 몇 데이터베이스가있는 경우과 같이뿐만 아니라 데이터베이스 이름을 지정해야합니다, 당신을 마음 :
SELECT Auto_increment FROM information_schema.tables WHERE table_name='the_table_you_want' AND table_schema='the_database_you_want';
-
==============================
3.루카스 Lysik의 대답에 추가 - 종류의 SQL의 LEFT-가입하세요. 내가 알고있는 것처럼, 경우 ID의이 : 1,2,4,5는 3을 반환해야합니다.
루카스 Lysik의 대답에 추가 - 종류의 SQL의 LEFT-가입하세요. 내가 알고있는 것처럼, 경우 ID의이 : 1,2,4,5는 3을 반환해야합니다.
SELECT u.Id + 1 AS FirstAvailableId FROM users u LEFT JOIN users u1 ON u1.Id = u.Id + 1 WHERE u1.Id IS NULL ORDER BY u.Id LIMIT 0, 1
게시물 오히려 오래된 있지만, 그것은 방문자의 일부를 도움이되기를 바랍니다.
-
==============================
4.당신이 코멘트에 말을 감안할 때 :
당신이 코멘트에 말을 감안할 때 :
당신이 다음 삽입 된 행의 ID가 삽입 실제로 이전에 일 무슨 테이블을 요청하는 것입니다, 이는 요구하고 무엇을 할 수있는 방법이 있습니다 :
SHOW TABLE STATUS WHERE name = "myTable"
당신에게 다음 자동 증가 값을 알려줍니다 "AUTO_INCREMENT"이라고 그 결과 집합의 필드가있을 것입니다.
-
==============================
5.내가 알고있는 것처럼, 경우 ID의이 : 1,2,4,5는 3을 반환해야합니다.
내가 알고있는 것처럼, 경우 ID의이 : 1,2,4,5는 3을 반환해야합니다.
SELECT t1.id + 1 FROM theTable t1 WHERE NOT EXISTS ( SELECT * FROM theTable t2 WHERE t2.id = t1.id + 1 ) LIMIT 1
-
==============================
6.당신은 말했다 :
당신은 말했다 :
당신을 위해 무엇을 요구하는지하는 것은 매우 위험하며 경쟁 조건으로 이어질 것입니다. 코드가 다른 사용자가 같은 시간에 두 번 실행하면, 그들은 모두 6을 얻을 것이다 그들의 업데이트 또는 삽입이 서로를 통해 모든 단계됩니다.
난 당신이 대신 테이블에 INSERT LAST_INSERT_ID을 (사용 AUTO_INCREMENT 값)를 취득하고 당신이이 AUTO_INCREMENT 값에 따라이 어떤 값 세트에 행을 업데이트하는 것이 좋습니다.
-
==============================
7.첫 번째 간격을 선택하려면이를 사용 :
첫 번째 간격을 선택하려면이를 사용 :
SELECT @r FROM ( SELECT @r := MIN(id) - 1 FROM t_source2 ) vars, t_source2 WHERE (@r := @r + 1) <> id ORDER BY id LIMIT 1;
동일한 쿼리의 ANSI 구문 버전이 있습니다 :
SELECT id FROM mytable mo WHERE ( SELECT id + 1 FROM mytable mi WHERE mi.id < mo.id ORDER BY mi.id DESC LIMIT 1 ) <> id ORDER BY id, LIMIT 1
그러나, 그것은 때문에 MySQL의에서 최적화 버그로 느려집니다.
-
==============================
8.당신은 정말 (내 의견이 아니라 아주 좋은 생각이다) 행을 삽입하기 전에 다음 삽입의 키를 계산 싶은 경우에, 나는 당신이 현재 아이디와 하나 사용되는 최대 값을 사용하는 것이 좋습니다 것입니다 :
당신은 정말 (내 의견이 아니라 아주 좋은 생각이다) 행을 삽입하기 전에 다음 삽입의 키를 계산 싶은 경우에, 나는 당신이 현재 아이디와 하나 사용되는 최대 값을 사용하는 것이 좋습니다 것입니다 :
SELECT MAX(id) + 1 FROM table
하지만 당신은 MySQL이와 ()는 DBMS에서 그걸 얻기 위해 LAST_INSERT_ID를 사용하여 (A 자동 증가 열을 사용하여) 아이디 자체를 만들 수 있도록 제안했다. 이렇게하려면 삽입과 같은 ID에 대한 다음 쿼리를 실행하는 트랜잭션을 사용 :
INSERT INTO table (col1) VALUES ("Text"); SELECT LAST_INSERT_ID();
returnset 이제 새롭게 생성 된 행의 ID를 보유 하나의 열을 포함한다.
-
==============================
9.지금은이 질문에 대답하기 너무 늦게, 그러나이 사람을 도움이되기를 바랍니다.
지금은이 질문에 대답하기 너무 늦게, 그러나이 사람을 도움이되기를 바랍니다.
@Eimantas 이미 최선의 답을 주신하지만 동일한 서버에서 같은 이름으로 두 개 이상의 테이블이있는 경우이 솔루션은 작동하지 않습니다.
나는 약간 위의 문제를 해결하기 위해 Eimantas의 대답 @ 수정했습니다.
select Auto_increment as id from information_schema.tables where table_name = 'table_name' and table_schema = 'database_name'
-
==============================
10.그것을 할 수있는 한 가지 방법은 자동 증분으로 인덱스를 설정하는 것입니다. 그런 다음 SQL 문은 단순히 NULL을 지정하고 SQL 구문 분석기는 당신을 위해 나머지를한다.
그것을 할 수있는 한 가지 방법은 자동 증분으로 인덱스를 설정하는 것입니다. 그런 다음 SQL 문은 단순히 NULL을 지정하고 SQL 구문 분석기는 당신을 위해 나머지를한다.
INSERT INTO foo VALUES (null);
-
==============================
11.이 새 레코드를 삽입 함께 사용되는 경우는 다음과 같이 사용할 수 있습니다.
이 새 레코드를 삽입 함께 사용되는 경우는 다음과 같이 사용할 수 있습니다.
(당신은 ID가 자동 증분입니다 귀하의 의견에 언급 한 다른 테이블에 다음 ID + 1이 필요합니다)
INSERT INTO TABLE2 (id, field1, field2, field3, etc) VALUES( SELECT (MAX(id) + 1), field1, field2, field3, etc FROM TABLE1 WHERE condition_here_if_needed )
이 의사이다 그러나 당신은 생각을
-
==============================
12.많은 솔루션의 문제는 "1"경우 무시하고 그들은 단지 다음 "GAP"을 찾을 수 있습니다 볼 수 있습니다, 또는 행이없는 경우 그들은 다음 "GAP"로 NULL을 반환 할 수 있습니다.
많은 솔루션의 문제는 "1"경우 무시하고 그들은 단지 다음 "GAP"을 찾을 수 있습니다 볼 수 있습니다, 또는 행이없는 경우 그들은 다음 "GAP"로 NULL을 반환 할 수 있습니다.
사용 가능한 첫 번째 숫자가 1 인 경우에만 다음 사용 가능한 차이를 발견 할 수는 없을 것이다 다음은, 또한 고려 있습니다 :
SELECT CASE WHEN MIN(MyID) IS NULL OR MIN(MyID)>1 -- return 1 if it's available or if there are no rows yet THEN 1 ELSE -- find next gap (SELECT MIN(t.MyID)+1 FROM MyTable t (updlock) WHERE NOT EXISTS (SELECT NULL FROM MyTable n WHERE n.MyID=t.MyID+1)) END AS NextID FROM MyTable
-
==============================
13.이것은 또한 "시작"위치의 문제를 해결, 나 (MySQL은 5.5) 잘했다.
이것은 또한 "시작"위치의 문제를 해결, 나 (MySQL은 5.5) 잘했다.
SELECT IF(res.nextID, res.nextID, @r) AS nextID FROM (SELECT @r := 30) AS vars, ( SELECT MIN(t1.id + 1) AS nextID FROM test t1 LEFT JOIN test t2 ON t1.id + 1 = t2.id WHERE t1.id >= @r AND t2.id IS NULL AND EXISTS ( SELECT id FROM test WHERE id = @r ) LIMIT 1 ) AS res LIMIT 1
이러한 유형의 쿼리 전에 언급 한 바와 같이 최소한의 MySQL에 매우 느리다.
-
==============================
14.
SELECT ID+1 "NEXTID" FROM ( SELECT ID from TABLE1 WHERE ID>100 order by ID ) "X" WHERE not exists ( SELECT 1 FROM TABLE1 t2 WHERE t2.ID=X.ID+1 ) LIMIT 1
-
==============================
15.
<?php Class Database{ public $db; public $host = DB_HOST; public $user = DB_USER; public $pass = DB_PASS; public $dbname = DB_NAME; public $link; public $error; public function __construct(){ $this->connectDB(); } private function connectDB(){ $this->link = new mysqli($this->host, $this->user, $this->pass, $this->dbname); if(!$this->link){ $this->error ="Connection fail".$this->link->connect_error; return false; } } // Select or Read data public function select($query){ $result = $this->link->query($query) or die($this->link->error.__LINE__); if($result->num_rows > 0){ return $result; } else { return false; } } } $db = new Database(); $query = "SELECT * FROM table_name WHERE id > '$current_postid' ORDER BY ID ASC LIMIT 1"; $postid = $db->select($query); if ($postid) { while ($result = $postid->fetch_assoc()) { echo $result['id']; } } ?>
from https://stackoverflow.com/questions/1405393/finding-the-next-available-id-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 2008 - IF는 NOT INSERT ELSE UPDATE 존재 (0) | 2020.04.30 |
---|---|
[SQL] MyBatis로 일괄 삽입 / 업데이트 오라클 (0) | 2020.04.30 |
[SQL] 어떻게 SQL Server의 시간을 비교할 수 있습니까? (0) | 2020.04.30 |
[SQL] 어떻게 그룹 CONCAT MySQL의와 JSON 형식을 만들? (0) | 2020.04.30 |
[SQL] 어떻게 하나의 SQL 문에서 VARCHAR [N] 필드의 크기를 얻으려면? (0) | 2020.04.30 |