2013-04-04 12 views

Odpowiedz

396

można uzyskać wszystkie dane tabeli przy użyciu tej kwerendy:

SHOW TABLE STATUS FROM `DatabaseName` WHERE `name` LIKE 'TableName' ; 

można uzyskać dokładnie te informacje za pomocą tej kwerendy:

SELECT `AUTO_INCREMENT` 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'DatabaseName' 
AND TABLE_NAME = 'TableName'; 
+4

Wow, oświetlenie szybko !! Dzięki!! +2 punkty – bparise

+22

Można również użyć 'DATABASE()' zamiast jawnej nazwy bazy danych. – Mido

+18

Uwaga: BAZA DANYCH() ma wartość NULL, jeśli nie wysłano komendy USE * DATABASE * – methai

19

wierzę szukasz MySQL LAST_INSERT_ID() funkcja. Jeśli w wierszu poleceń, wystarczy uruchomić następujące:

LAST_INSERT_ID(); 

Można również uzyskać tę wartość przez SELECT zapytania:

SELECT LAST_INSERT_ID(); 
+0

To nie jest najlepszy pomysł, aby go dodać i oczekiwać, będzie to identyfikator następnego rzędu. W międzyczasie inna transakcja mogła wstawić nowy wiersz, a Ty użyłbyś niewłaściwego ID? – agim

+0

Masz rację. Sądzę, że zależy to od środowiska, w którym się znajdujesz. Jeśli jest to kontrolowane środowisko testowe, najprawdopodobniej możesz je dodać i być bezpieczne. Najlepsza odpowiedź została dostarczona przez Metai. – jvdub

+2

Jaka jest najlepsza odpowiedź, zależy od tego, co chcesz osiągnąć. Jeśli wstawisz nowy wiersz i chcesz poznać utworzony identyfikator, twoja odpowiedź jest najlepszą odpowiedzią, ponieważ LAST_INSERT_ID() jest bezpieczna dla transakcji i zapewnia, że ​​otrzymasz identyfikator dla utworzonego obiektu. Głosowałem za twoją odpowiedzą, ale chciałbym usunąć tę część za pomocą "dodaj do niej ..." – agim

10

Jeśli tylko chcesz znać liczbę, niż dostać go w zapytanie następnie można użyć:

SHOW CREATE TABLE tablename; 

Powinieneś zobaczyć AUTO_INCREMENT na dole

+4

To nie działa, jeśli tabela nie ma wierszy, a auto_increment ma wartość '1'. – Pacerier

3

mysqli wykonywalny kod przykładowy:

<?php 
     $db = new mysqli("localhost", "user", "password", "YourDatabaseName"); 
     if ($db->connect_errno) die ($db->connect_error); 

     $table=$db->prepare("SHOW TABLE STATUS FROM YourDatabaseName"); 
     $table->execute(); 
     $sonuc = $table->get_result(); 
      while ($satir=$sonuc->fetch_assoc()){ 
       if ($satir["Name"]== "YourTableName"){ 
        $ai[$satir["Name"]]=$satir["Auto_increment"]; 
       } 
      } 
     $LastAutoIncrement=$ai["YourTableName"]; 
     echo $LastAutoIncrement; 
    ?> 
1

Jeśli kolumna jest autoincremented w serwerze sql wtedy zobaczyć aktualną wartość autoincremented, a jeśli chcesz zmienić tę wartość dla danej kolumny użyć następującego zapytania.

-- to get current value 
 
select ident_current('Table_Name') 
 

 
-- to update current value 
 
dbcc checkident ('[Table_Name]',reseed,"Your Value")

3

Pomimo methai „s odpowiedź jest poprawna, jeśli ręcznie uruchomić kwerendę, problem pojawia się, gdy 2 jednoczesnych transakcji/połączenia faktycznie wykonać tej kwerendy w czasie wykonywania w produkcji (na przykład).

prostu próbowałem ręcznie w warsztacie MySQL z 2 połączenia równoczesnego otwarcia:

CREATE TABLE translation (
    id BIGINT PRIMARY KEY AUTO_INCREMENT 
); 
# Suppose we have already 20 entries, we execute 2 new inserts: 

Transakcji 1:

21 = SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_SCHEMA = 'DatabaseName' AND TABLE_NAME = 'translation'; 

insert into translation (id) values (21); 

transakcja 2:

21 = SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_SCHEMA = 'DatabaseName' AND TABLE_NAME = 'translation'; 

insert into translation (id) values (21); 

# commit transaction 1; 
# commit transaction 2; 

Insert o f transakcja 1 jest ok: Wstawienie transakcji 2 jest błędne: Kod błędu: 1062. Zduplikowany wpis "21" dla klucza "PODSTAWOWY".

Dobrym rozwiązaniem byłoby jvdub „s odpowiedź bo za transakcję/połączenia na 2 wkładki będą:

transakcja 1:

insert into translation (id) values (null); 
21 = SELECT LAST_INSERT_ID(); 

transakcja 2:

insert into translation (id) values (null); 
22 = SELECT LAST_INSERT_ID(); 

# commit transaction 1; 
# commit transaction 2; 

Ale mamy t o wykonaj last_insert_id() tuż po wstawieniu! Możemy ponownie użyć tego identyfikatora do wstawienia do innych tabel, w których oczekuje się klucza obcego!

Również nie możemy wykonać 2 zapytań w następujący sposób:

insert into translation (id) values ((SELECT AUTO_INCREMENT FROM 
    information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() 
    AND TABLE_NAME='translation')); 

bo rzeczywiście jesteśmy zainteresowani, aby chwycić/ponowne użycie tego identyfikatora w innej tabeli lub powrócić!

+1

Dobre wyjaśnienie! dzięki. Teraz jasne jest, dlaczego chcemy użyć 'last_insert_id()' – Imtiaz

Powiązane problemy