zastanawia mnie jedna roznica pomiedzy tymi dwoma SZBD.
Przykład: mam kod tworzacy tabele
MySQL:
CREATE TABLE test ( id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, imie VARCHAR(40) NOT NULL, PRIMARY KEY(id), UNIQUE INDEX test_index3242(imie) );
oraz PostgreSQL
Cytat
CREATE TABLE test (
id SERIAL NOT NULL,
imie VARCHAR(40) NOT NULL UNIQUE,
PRIMARY KEY (id)
);
id SERIAL NOT NULL,
imie VARCHAR(40) NOT NULL UNIQUE,
PRIMARY KEY (id)
);
Następnie wykonuję następujące zapytania:
MySQL:
mysql> INSERT INTO test (imie) VALUES ('Michal'); Query OK, 1 row affected (0.03 sec) mysql> INSERT INTO test (imie) VALUES ('Michal'); ERROR 1062 (23000): Duplicate entry 'Michal' FOR KEY 2 mysql> INSERT INTO test (imie) VALUES ('Tomek'); Query OK, 1 row affected (0.02 sec)
PostgreSQL:
template1=# INSERT INTO test (imie) VALUES ('Michal'); INSERT 17727 1 template1=# INSERT INTO test (imie) VALUES ('Michal'); ERROR: duplicate KEY violates UNIQUE constraint "test_imie_key" template1=# template1=# template1=# template1=# INSERT INTO test (imie) VALUES ('Tomek'); INSERT 17729 1
Następnie:
i wyniki:
SELECT * FROM test
MySQL:
Kod
+----+--------+
| id | imie |
+----+--------+
| 1 | Michal |
| 2 | Tomek |
+----+--------+
2 rows in set (0.01 sec)
| id | imie |
+----+--------+
| 1 | Michal |
| 2 | Tomek |
+----+--------+
2 rows in set (0.01 sec)
PostgreSQL:
Kod
template1=# SELECT * FROM test;
1 | Michal
3 | Tomek
1 | Michal
3 | Tomek
I moje pytanie jest następujące: dlaczego PostgreSQL w przypadku nieudanej proby dodania nowej pozycji (tutaj za sprawa UNIQUE) juz "rezewuje" klucz glowny o numerze 2 (w przeciwienstwie do MySQL'a).
Wlasciwie przy tego typu opecji wszystko jedno jaka wartosc bedzie mial klucz glowny, pytam tylko z czystej ciekawosci. Mam tutaj swoja teorie dlaczego tak sie dzieje, natomiast nie chcialbym zmyslac dlatego tez pytam. Moze ktos z Was wie jak to wyglada w innych SZBD.
Pozdrawiam.