W MySQL, kiedy wstawiasz nowy rekord do tabeli z automatycznie inkrementowanym kluczem głównym (zwykle za pomocą atrybutu `AUTO_INCREMENT`), możesz chcieć od razu uzyskać wartość tego klucza głównego. Istnieje kilka sposobów, aby to zrobić:
Użycie `LAST_INSERT_ID()`
Najczęściej używaną funkcją w MySQL do uzyskania ostatniego wygenerowanego ID jest `LAST_INSERT_ID()`. Funkcja ta zwraca ostatnią wartość `AUTO_INCREMENT` używaną w bieżącej sesji. Jest ona specyficzna dla sesji, co oznacza, że różne sesje nie wpłyną na siebie nawzajem.
Jeśli używasz czystego SQL, możesz zrobić to w następujący sposób:
INSERT INTO twoja_tabela (kolumna1, kolumna2) VALUES ('wartość1', 'wartość2');
SELECT LAST_INSERT_ID();
Jeśli używasz interfejsu programowania, takiego jak JDBC w Javie, PHP, Pythona lub innego, prawdopodobnie będziesz miał metodę, która pozwoli ci to zrobić w bardziej zintegrowany sposób.
W Javie z JDBC
Przykład w Javie z użyciem JDBC wygląda następująco:
// Ustalamy połączenie z bazą danych
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/TwojaBaza", "uzytkownik", "haslo");
// Stworzenie zapytania SQL z możliwością pobrania kluczy wygenerowanych
PreparedStatement ps = conn.prepareStatement("INSERT INTO twoja_tabela (kolumna1, kolumna2) VALUES (?, ?)", Statement.RETURN_GENERATED_KEYS);
// Ustawienie wartości parametrów
ps.setString(1, "wartość1");
ps.setString(2, "wartość2");
// Wykonanie zapytania
ps.executeUpdate();
// Pobranie wygenerowanych kluczy
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
long idNowegoRekordu = rs.getLong(1);
}
W PHP
W PHP z użyciem rozszerzenia MySQLi, możesz to zrobić w następujący sposób:
// Ustalamy połączenie z bazą danych
$conn = new mysqli("localhost", "uzytkownik", "haslo", "TwojaBaza");
// Stworzenie zapytania SQL
$sql = "INSERT INTO twoja_tabela (kolumna1, kolumna2) VALUES ('wartość1', 'wartość2')";
// Wykonanie zapytania
if ($conn->query($sql) === TRUE) {
$idNowegoRekordu = $conn->insert_id;
}
Uwagi
- `LAST_INSERT_ID()` jest bezpieczna w użyciu w środowiskach wielowątkowych i wieloprocesowych, ponieważ wartość jest przechowywana w kontekście bieżącej sesji.
- Wartość zwracana przez `LAST_INSERT_ID()` to ostatnie wygenerowane ID w bieżącej sesji. Jeśli więc wykonasz więcej niż jedno zapytanie `INSERT` w ramach jednej sesji, upewnij się, że pobierasz `LAST_INSERT_ID()` bezpośrednio po zapytaniu `INSERT`, które Cię interesuje.
- Jeśli wstawiasz wiele wierszy za pomocą jednego zapytania `INSERT`, `LAST_INSERT_ID()` zwróci ID pierwszego z wierszy.
- Pobieranie `LAST_INSERT_ID()` jest operacją lekką i nie wpływa na wydajność.
Komentarz