Avatar billede bolmer Nybegynder
22. juni 2005 - 21:06 Der er 7 kommentarer og
1 løsning

Problemer med foreign key og primary key

Jeg har lavet følgende 2 tabeller:

create table Person (
    Name varchar(15) not null,
    Address varchar(15) not null,
    Phone varchar(12), /* optional */
    primary key (Name)
);

create table Employee (
    Name varchar(15) not null,
    Salary numeric(10,2),
    Emp_No smallint unique not null,
    primary key (Emp_No),
    foreign key (Name) references Person(Name)
);

Jeg har så indsat følgende:

insert into Person values ('Jens', 'Odense', 12345678);
insert into Person values ('Peter', 'Århus', 98989898);
insert into Employee values ('Hans', 123, 2);

Men hvordan kan det lade sig gøre at indsætte 'Hans' når han ikke er i Person tabellen?

Jeg troede at når man angiver en foreign key så skal den attribut man ønsker at indsætte befinde sig i den table man referere til.
Avatar billede arne_v Ekspert
22. juni 2005 - 21:15 #1
mysql> create table Person (
    ->    Name varchar(15) not null,
    ->    Address varchar(15) not null,
    ->    Phone varchar(12), /* optional */
    ->    primary key (Name)
    -> ) type=innodb;
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> create table Employee (
    ->    Name varchar(15) not null,
    ->    Salary numeric(10,2),
    ->    Emp_No smallint unique not null,
    ->    primary key (Emp_No),
    ->    foreign key (Name) references Person(Name)
    -> ) type=innodb;
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> insert into Person values ('Jens', 'Odense', 12345678);
Query OK, 1 row affected (0.00 sec)

mysql> insert into Person values ('Peter', 'Århus', 98989898);
Query OK, 1 row affected (0.00 sec)

mysql> insert into Employee values ('Hans', 123, 2);
ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails
Avatar billede bolmer Nybegynder
22. juni 2005 - 21:21 #2
Pænt sort. Jeg har skrevet det ovenstående i en test.sql fil som jeg så importere ved at skrive:

source test.sql

Når jeg så skriver select * from Employee så kan jeg se at Hans er blevet indsat.

Der er åbenbart forskel på at skrive det direkte i konsollen eller i en .sql fil.
Avatar billede arne_v Ekspert
22. juni 2005 - 21:28 #3
det tror jeg ikke

men prøv lige at check om tabellerne er blevet oprettet som InnoDB eller som MyISAM
Avatar billede bolmer Nybegynder
22. juni 2005 - 21:36 #4
Jeg har ikke eksplicit angivet InnoDB. Jeg har læst at det automatisk er tilføjet fra version 4.0.
http://dev.mysql.com/doc/mysql/en/innodb-configuration.html

Men hvis jeg skriver "show create table Employee" står der følgende:

ENGINE=MyISAM DEFAULT CHARSET=latin1

Men det hænger jo ikke sammen med hvad der står på ovenstående link.
Avatar billede arne_v Ekspert
22. juni 2005 - 21:39 #5
#From MySQL 4.0 on, the InnoDB storage engine is enabled by default

betyder at MySQL 4.x som default har muligheden for at lave InnoDB tabeller
(i MySQL 3.x skulle man have MAX versionen for at have InnoDB support)

Det betyder ikke at den er default engine.
Avatar billede arne_v Ekspert
22. juni 2005 - 21:40 #6
så opret lige dine tabeller med type=innodb

(ligesom i mit eksempel)
Avatar billede bolmer Nybegynder
22. juni 2005 - 21:46 #7
Ok tak skal du ha! Du skal have dine point.
Avatar billede arne_v Ekspert
22. juni 2005 - 21:49 #8
så ligger jeg et svar
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