Tags: MySQL

MySQL: uzyskać identyfikator klucza głównego nowego rekordu z zapytania wstawiania?

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ść.