2013-03-15 11 views
6

Jak mogę uzyskać nazwę kolumny auto_increment z tabeli (NIE OSTATNI IDENTYFIKATOR WSTAWKI)?Wykryj kolumnę automatycznej inkrementacji

na przykład:

create table members (member_id int auto_increment, name char(50), primary key(member_id)); 

Co mogę zrobić, aby uzyskać member_id od członków stołowych.

Robię klasy php, i mam zamiar dodać metodę, która pozwoli Ci uzyskać to tak:

$members->findById(123); 

Należy wiedzieć, aby znaleźć kolumny automatycznego przyrostu i zbudować kwerendę opartą na to następnie wykonaj zapytanie.

+0

Ale nie muszę identyfikator insert, muszę nazwę kolumny. –

+1

Głosowanie w celu ponownego otwarcia. To pytanie zostało oznaczone jako duplikat, ale inne pytanie jest inne. –

Odpowiedz

8

Można uzyskać kolumnę z

show columns from members where extra like '%auto_increment%' 

Pierwsza kolumna Field jest imię i nazwisko kolumna AUTO_INCREMENT.

$sql = "show columns from members where extra like '%auto_increment%'"; 
$sth = $dbh->prepare($sql) or die($dbh->error()); 
$sth->execute() or die($dbh->error()); 
$row = $sth->fetch(); 
$column = $row['Field']; 
+3

Dlaczego downvote? .... to jest dobra odpowiedź! – beck03076

0

Będziesz musiał przygotować wyciąg w sposób dynamiczny na podstawie informacji_schematu, a następnie go wykonać.

PREPARE stmt FROM concat(
'select * from members where ', 
(select COLUMN_NAME 
    from INFORMATION_SCHEMA.COLUMNS 
    where table_name='members' and EXTRA like '%auto_increment%'), 
    '=?' 
); 
EXECUTE stmt; 
1
SELECT column_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_name = "members" 
AND  extra = "auto_increment"; 

Spróbuj tego!

1

Zaimplementowałem ten typ funkcji jako część składnika Zend_Db podczas pracy nad Zend Framework. Odkryłem, że dostęp do INFORMATION_SCHEMA jest zbyt wolny, więc zamiast tego musiałem użyć DESCRIBE.

Coś jak następujące (ale to jest uproszczony kod właśnie testowane, nie będące częścią Zend Framework):

function getAutoIncColumn($table) 
{ 
    global $dbh; 

    $stmt = $dbh->query("DESCRIBE `$table`"); 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     if (strstr($row["Extra"], "auto_increment")) { 
     return $row["Field"]; 
     } 
    } 
    return null; 
} 
+0

Problemy z powolnym tworzeniem się informacji można rozwiązać za pomocą: 'set global innodb_stats_on_metadata = 0;' –

+0

@MichaelBenjamin, dzięki Wiem o tej zmiennej konfiguracyjnej. To dobre rozwiązanie. Ale może nie zostać ustawione, a aplikacja PHP może nie mieć uprawnień SUPER wymaganych do zmiany zmiennych globalnych. –

+0

'set session innodb_stats_on_metadata = 0;' dla zapytań używających schematu informacji w takim przypadku. –

Powiązane problemy