MySQL odpowiednik Oracle SEQUENCE.NEXTVAL


Muszę mieć możliwość wygenerowania zapytania wykonania, które zwróci następującą wartość identyfikatora w poniższej tabeli:
CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id))

W Oracle możesz wywołać NEXTVAL na sekwencji i da ci następującą sekwencję (Uwaga: bez konieczności wstawiania do tabeli).
Po wygooglowaniu odkryłem, że aktualną wartość auto_increment można znaleźć za pomocą następującego zapytania:
SELECT Auto_increment 
FROM information_schema.tables
WHERE table_name='animals';

Problem polega na tym, że chciałbym, aby wartość rosła za każdym razem, gdy jest wymagana. W Oracle, kiedy wywołujesz nextval, wartość sekwencji jest zwiększana, nawet jeśli nie wstawiasz wiersza do tabeli.
Czy istnieje sposób na zmodyfikowanie powyższego zapytania, aby wartość zwracana była zawsze inna niż ostatnie wywołanie zapytania? to znaczy, Auto_increment jest zwiększane za każdym razem, gdy jest sprawdzane, a gdy jest używane w zapytaniu, użyje nowej wartości.
Używam Spring JDBCTemplate, więc jeśli da się to zrobić w jednym żądaniu, tym lepiej.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

http://docs.oracle.com/cd/E179 ... .html
http://docs.oracle.com/cd/E179 ... .html

3.6.9. Korzystanie z AUTO_INCREMENT

Atrybut AUTO_INCREMENT może służyć do tworzenia unikalnego identyfikatora dla nowych wierszy:

CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id));INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');SELECT * FROM animals;
Which returns:+----+---------+
| id | name |
+----+---------+
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
+----+---------+
Nie określono wartości dla kolumny AUTO_INCREMENT, więc MySQL automatycznie przypisał numery sekwencyjne. Możesz również jawnie przypisać NULL lub 0 do kolumny, aby wygenerować numery sekwencyjne.
Najnowszą wartość AUTO_INCREMENT można uzyskać za pomocą funkcji SQL LAST_INSERT_ID () lub funkcji mysql_insert_id () interfejsu C API. Te funkcje są zależne od połączenia, więc ich wartości zwracane są niezależne od innego połączenia, które również wykonuje operacje wstawiania.
Użyj najmniejszego typu danych w postaci liczby całkowitej dla kolumny AUTO_INCREMENT, która jest wystarczająco duża, aby pomieścić maksymalną wymaganą wartość sekwencji. Gdy kolumna osiągnie górną granicę typu danych, następna próba wygenerowania numeru kolejnego kończy się niepowodzeniem. Jeśli to możliwe, użyj atrybutu UNSIGNED, aby zezwolić na większy zakres. Na przykład, jeśli używasz TINYINT, maksymalny dozwolony numer kolejny to 127. Dla TINYINT UNSIGNED, maksymalna wartość to 255. Zakresy wszystkich typów liczb całkowitych, patrz Sekcje 11.2.1, „Typy całkowite (dokładna wartość) - INTEGER , INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT ”.
Uwaga
W przypadku wstawiania wielorzędowego LAST_INSERT_ID () i mysql_insert_id () w rzeczywistości zwracają klucz AUTO_INCREMENT z pierwszego wstawionego wiersza. Pozwala to na poprawne odtwarzanie wielorzędowych wstawek na innych serwerach podczas konfigurowania replikacji.
Jeśli kolumna AUTO_INCREMENT jest częścią wielu indeksów, MySQL generuje wartości sekwencyjne przy użyciu indeksu, który zaczyna się od kolumny AUTO_INCREMENT, jeśli taka istnieje. Na przykład, jeśli tabela zwierząt zawiera indeksy PRIMARY KEY (grp, id) i INDEX (id), MySQL zignoruje klucz podstawowy w celu wygenerowania wartości sekwencji. W rezultacie tabela będzie zawierała jedną sekwencję, a nie sekwencję na wartość GRP.
Aby rozpocząć od wartości AUTO_INCREMENT innej niż 1, ustaw tę wartość za pomocą CREATE TABLE lub ALTER TABLE, na przykład:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
Notatki InnoDB
W przypadku tabel InnoDB należy zachować ostrożność, modyfikując kolumnę zawierającą wartość automatycznego inkrementacji w środku sekwencji instrukcji INSERT. Na przykład, jeśli użyjesz instrukcji UPDATE do wstawienia nowej, większej wartości w kolumnie autoincrement, kolejna instrukcja INSERT może napotkać błąd „Zduplikowany wpis”. Sprawdzanie, czy wartość autoinkrementacji jest już obecna, ma miejsce, jeśli wykonasz DELETE, po którym następują inne instrukcje INSERT, lub gdy wykonujesz transakcję COMMIT, ale nie po instrukcji UPDATE.
MyISAM Notes
W przypadku tabel MyISAM można określić AUTO_INCREMENT dla kolumny dodatkowej w indeksie wielokolumnowym. W tym przypadku wygenerowana wartość dla kolumny AUTO_INCREMENT jest obliczana jako MAX (auto_increment_column) + 1 WHERE prefiks = dany-prefiks. Jest to przydatne, gdy chcesz umieścić dane w uporządkowanych grupach.

CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)) ENGINE=MyISAM;INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');SELECT * FROM animals ORDER BY grp,id;
Which returns:+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
W tym przypadku (gdy kolumna AUTO_INCREMENT jest częścią indeksu wielokolumnowego) wartości AUTO_INCREMENT są ponownie używane, jeśli usuniesz wiersz z największą wartością AUTO_INCREMENT w dowolnej grupie. Dzieje się tak nawet w przypadku tabel MyISAM, dla których wartości AUTO_INCREMENT zwykle nie są ponownie używane.
Dalsze czytanie
Więcej informacji o AUTO_INCREMENT można znaleźć tutaj:
Jak przypisać atrybut AUTO_INCREMENT do kolumny: Sekcja 13.1.17, „Tworzenie składni tabeli” i Sekcja 13.1.7, „Zmiana składni tabeli”.
Jak zachowuje się AUTO_INCREMENT w zależności od trybu SQL NO_AUTO_VALUE_ON_ZERO: Sekcja 5.1.7, „Tryby SQL Server”.
Jak korzystać z funkcji LAST_INSERT_ID (), aby znaleźć wiersz zawierający najnowszą wartość AUTO_INCREMENT: Sekcja 12.14, „Funkcje informacyjne”.
Ustawianie wartości AUTO_INCREMENT do użycia: Sekcja 5.1.4, „Zmienne systemowe serwera”.
AUTO_INCREMENT i replikacja: sekcja 16.4.1.1, „Replikacja i AUTO_INCREMENT”.
Serwer - zmienne systemowe powiązane z funkcją AUTO_INCREMENT (auto_increment_increment i auto_increment_offset), które można wykorzystać do replikacji: Sekcja 5.1.4, „Zmienne systemowe serwera”.
http:// search.oracle.com/search/search? m = auto_increment & amp; group = Documentation & amp; x = 0 & amp; y = 0
http://search.oracle.com/searc ... y%3D0
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ten przykład InnoDB pokazuje sposób implementacji własnego licznika przy użyciu żądań blokujących:
http://dev.mysql.com/doc/refma ... .html
http://dev.mysql.com/doc/refma ... .html
Dlaczego musisz stworzyć lukę? Identyfikatory rezerw?
Wolałbym zaktualizować projekt i zaktualizować inne moduły za wszelką cenę, zamiast dotykać sekwencji.
Zamiast tylko jawnie zwiększać sekwencję, sugerowałbym to, wstawiając domyślny (oznaczony jako nieprawidłowy) ciąg dla każdego identyfikatora, aby podświetlić i zwrócić identyfikator. To podejście jest spójne i przenośne.
Później, zamiast wymuszać wstawianie przy użyciu jawnej wartości sekwencji, można zaktualizować te domyślne wiersze za pomocą odpowiadających im wartości sekwencji.
Wymaga to więcej pamięci, ale nie ma blokad. W tym przypadku może pomóc zbieranie śmieci na nieaktualnych liniach. instrukcje "insert or update" mogą odtworzyć ciągi zebrane z pamięci, chociaż nie zrobiłbym tego.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz dodać własną funkcję MySQL - jak pokazano na

http://www.microshell.com/data ... ysql/
http://www.microshell.com/data ... ysql/
- pozwalając zrobić coś takiego:
SELECT nextval('sq_my_sequence') as next_sequence;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

MySQL używa
AUTO_INCREMENT
, który spełnia swoje zadanie. Ale są też inne różnice:
Różnice między MySQL
AUTO_INCREMENT
a Oracle
SEQUENCE
  • AUTO_INCREMENT jest ograniczone do jednej kolumny na tabelę
  • AUTO_INCREMENT musi być przypisane do konkretnej tabeli. Kolumna (nie zezwala na wiele tabel)
  • AUTO_INCREMENT jest WSTAWIONY jako nieokreślona kolumna lub NULL

jeśli chcesz zobaczyć implementację SEQUENCE w MySQL, możesz to zrobić za pomocą SP.
Zobacz poniższy link wyjaśniający, co chcesz.
http://ronaldbradford.com/blog ... 01-26
http://ronaldbradford.com/blog ... 1-26/
/
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Czy potrzebujesz następującej wartości w tabeli THAT, aby móc tworzyć wiersze, które nie zostały jeszcze wstawione, bez zakłócania innych procesów automatycznego zwiększania wartości?
Niektóre opcje:
Śmiało i po prostu wstaw wiersze, aby „użyć sekwencji”, oznacz je jako oczekujące, a następnie zaktualizuj je później.
Wstaw do transakcji i przerwij transakcję - użyj sekwencji numerów rejestracyjnych i uzupełnij "lukę" w tabeli - ten numer jest teraz dla Ciebie bezpłatny.
W przypadku Oracle sekwencja jest całkowicie niezależna od tabeli, więc procesy mogą używać tej sekwencji lub nie (a także mogą używać tej samej sekwencji dla różnych tabel). W tym duchu można zaimplementować tabelę tylko dla sekwencji, do której dostęp uzyskuje się za pośrednictwem niektórych funkcji, a dla innych procesów, które muszą opierać się na automatycznej inkrementacji, usunąć automatyczną inkrementację i użyć wyzwalacza, który przypisuje tę samą funkcję do sekwencji, nie określono identyfikatora.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Przyjrzyj się silnikowi MariaDBs
SEQUENCE
. Dzięki niemu możesz generować sekwencje tak łatwo, jak
SELECT seq FROM seq_1_to_5;
+-----+
| seq |
+-----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+-----+

Detale

tutaj: https://mariadb.com/kb/en/mariadb/sequence
https://mariadb.com/kb/en/mariadb/sequence/
/
Dzięki temu powinieneś być w stanie zrobić coś takiego
SELECT min(seq) as nextVal FROM seq_1_to_500 
WHERE seq NOT IN (SELECT ID FROM customers)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

1.) create table query
2.) Insert query
3.) Update query
4.) Select query for that table e.g. SELECT next_val FROM hib_sequence;
5.) Before each select update first, like this you can achieve similar-- CREATE TABLE hib_sequence (next_val INT NOT NULL);
-- UPDATE hib_sequence SET next_val=LAST_INSERT_ID(next_val+1);
-- select last_insert_id();
-- INSERT INTO hib_sequence VALUES (0);-- select next_val from hib_sequence;

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się