Avatar billede chrishunter Nybegynder
07. juli 2007 - 09:51 Der er 15 kommentarer og
1 løsning

PRIMARY KEY (noget, noget_andet) og AUTO_INCREMENT problem

Hvis jeg opretter en tabel på følgende måde:

mysql> CREATE TABLE try (
    -> id_other      INT UNSIGNED NOT NULL,
    -> id          INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> something    CHAR(10),
    -> PRIMARY KEY (id, id_other)
    -> ) TYPE = INNODB;
Query OK, 0 rows affected, 1 warning (0.06 sec)

og indsætter nogle værdier:

mysql> INSERT INTO try (id_other, something) VALUES (1, 'bla');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO try (id_other, something) VALUES (1, 'blabla');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO try (id_other, something) VALUES (1, 'bla2');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO try (id_other, something) VALUES (2, 'bla2'), (2, 'bob'), (2, 'bobbob');
Query OK, 3 rows affected (0.03 sec)
Records: 3  Duplicates: 0  Warnings: 0

og derefter checker:

mysql> SELECT * FROM try;
+----------+----+-----------+
| id_other | id | something |
+----------+----+-----------+
|        1 |  1 | bla      |
|        1 |  2 | blabla    |
|        1 |  3 | bla2      |
|        2 |  4 | bla2      |
|        2 |  5 | bob      |
|        2 |  6 | bobbob    |
+----------+----+-----------+
6 rows in set (0.00 sec)

er resultatet ikke, som forventet.

Hvorfor numereres id ikke forfra, når id_other har fået en ny værdi? Er det ikke det jeg burde opnå ved at have sat PRIMARY KEY (id, id_other), da jeg kreerede tabellen?


Venlig hilsen
Christian
Avatar billede erikjacobsen Ekspert
07. juli 2007 - 10:03 #1
Nej, en autoincrement tæller bare op, uanset hvilke andre felter der måtte være. Som du ser ;)
Avatar billede chrishunter Nybegynder
07. juli 2007 - 10:23 #2
Også når jeg har sat PRIMARY KEY (id, id_other)?

Hvis jeg tager eksemplet fra http://dev.mysql.com/doc/refman/5.1/en/example-auto-increment.html, virker dette, som jeg forventer:

mysql> 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)
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO animals (grp,name) VALUES
    ->    ('mammal','dog'),('mammal','cat'),
    ->    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ->    ('bird','ostrich');
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM animals ORDER BY grp,id;
+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish  |  1 | lax    |
| mammal |  1 | dog    |
| mammal |  2 | cat    |
| mammal |  3 | whale  |
| bird  |  1 | penguin |
| bird  |  2 | ostrich |
+--------+----+---------+
6 rows in set (0.00 sec)
Avatar billede pidgeot Nybegynder
09. juli 2007 - 09:59 #3
Som der står på den side du linker til, fungerer det kun ud fra de kolonner der kommer FØR din auto_increment-kolonne i primærnøglen.
Avatar billede chrishunter Nybegynder
09. juli 2007 - 11:04 #4
Så jeg skal altså lave PRIMARY KEY (id_other, id)?
Avatar billede pidgeot Nybegynder
09. juli 2007 - 11:07 #5
Præcis. Bemærk samtidigt at du ikke må lave et ekstra indeks på id, så virker det nemlig ikke.
Avatar billede chrishunter Nybegynder
09. juli 2007 - 11:40 #6
Hvad menes med 'ekstra indeks'?
Avatar billede pidgeot Nybegynder
09. juli 2007 - 11:44 #7
...et indeks udover det der kommer fra din primærnøgle.
Avatar billede chrishunter Nybegynder
09. juli 2007 - 13:19 #8
Eksempelvis en FOREIGN KEY i en anden tabel?
Avatar billede pidgeot Nybegynder
09. juli 2007 - 13:26 #9
Nej, omend man generelt bør have et indeks på fremmednøgler.

Et indeks oprettes med CREATE INDEX.

Bemærk desuden at dokumentationen kun snakker om den funktionalitet for MyISAM (lagde ikke mærke til at du brugte InnoDB), så det kan muligvis også gå hen og spænde ben for dig.
Avatar billede chrishunter Nybegynder
09. juli 2007 - 14:40 #10
Okay, nu har jeg forsøgt mig med PRIMARY KEY (id_other, id), og resultatet er det samme.
Det har sikkert noget med InnoDB at gøre. Det vælger jeg i hvert fald at tro foreløbigt og så bare leve med dette.
Avatar billede chrishunter Nybegynder
09. juli 2007 - 15:03 #11
Undskyld, jeg havde glemt at gemme den .sql fil, hvor tabeldefinitionen er i. Så den jeg lavede naturligvis det nøjagtigt samme og fik derfor også det nøjagtigt samme resultat. Men når jeg bytter om på nøglerne og så forsøger, får jeg følgende svar:

> mysql -p < ./mkdatabase.sql
Enter password:
ERROR 1075 (42000) at line 33: Incorrect table definition; there can be only one auto column and it must be defined as a key
>

Uanset: Det er sikkert stadigt noget specifikt for InnoDB, der sikkert bare ikke understøtter det. So be it.
Avatar billede erikjacobsen Ekspert
14. juli 2007 - 15:49 #12
Bytter om? Hvad skriver du?
Avatar billede chrishunter Nybegynder
15. juli 2007 - 13:47 #13
Hvis jeg skriver PRIMARY KEY (id, id_other) får jeg ingen fejlmeddelelse. Men hvis jeg bytter om på rækkefælgen af id og id_other - så den, der auto incrementes, står efter den anden - og altså skriver PRIMARY KEY (id_other, id), får jeg en fejlmeddelelse.
Avatar billede erikjacobsen Ekspert
15. juli 2007 - 14:13 #14

1) Bruger du InnoDB så skriver du det bare på den første måde, uden at få den ønskede effekt, eller
2) skifter til MyISAM.

Men MyISAM er langt fra en "rigtig" databasemaskine. Du har sikkert brug for InnoDB, og så er det ikke muligt, det som du beskriver du vil have.
Avatar billede chrishunter Nybegynder
15. juli 2007 - 16:40 #15
Ja, jeg må bare leve med, at hver post har et unikt id. Det kan jeg såmænd også.
Avatar billede chrishunter Nybegynder
27. april 2008 - 13:57 #16
Emnet afsluttes ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester