Schrift
[thread]10519[/thread]

[PHP] NULL = 0 != null ??? (Seite 2)

Leser: 1


<< |< 1 2 3 4 >| >> 35 Einträge, 4 Seiten
nepos
 2007-10-08 11:07
#100474 #100474
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Da müsstest du mal in der MySQL-Doku nachlesen. Soweit ich weiss, muss man für die Benutzung von Fremdschlüsseln die MySQL-Tabellen nicht wie es per default ist als MyISAM-Tabellen anlegen, sondern eben als InnoDB. Nur damit kann MySQL dann wirklich mit den Fremdschlüsseln umgehen und prüft beim Insert auch, ob der Wert in der referenzierten Tabelle enthalten ist, der in die Tabelle eingefügt werden soll.
FlorianL
 2007-10-08 12:07
#100475 #100475
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
hmm :/

ich habe nun aufs innoDB design umgestellt, habe aber immernoch den selben fehler und keine meldung beim insert?!?!?

Code: (dl )
1
2
3
4
5
6
7
8
9
mysql> select * from meeting_teilnehmer;
+------------+---------------+
| meeting_id | teilnehmer_id |
+------------+---------------+
| 1 | 0 |
| 1 | 1 |
| 1 | 2 |
+------------+---------------+
3 rows in set (0.00 sec)


es gibt also immernoch den teilnehemr mit der id 0...
nepos
 2007-10-08 12:53
#100476 #100476
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hast du denn die Fremdschlüssel auch korrekt eingestellt?
Poste doch am besten mal die CREATE TABLE Statements für die beiden betroffenen Tabellen.
FlorianL
 2007-10-08 13:11
#100477 #100477
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
create database teammeeting;
use teammeeting;
create table meetings
(
ID INT AUTO_INCREMENT PRIMARY KEY,
`author` VARCHAR(64),
`startzeit` VARCHAR(64),
`endzeit` VARCHAR(64),
`thema` TEXT,
`aktion` VARCHAR(1),
`bearbeitung` VARCHAR(64),
`termin` VARCHAR(64),
`erstellung` VARCHAR(10),
)
;

CREATE TABLE `teilnehmer`
(
`id` int(11) AUTO_INCREMENT NOT NULL,
`vorname` varchar(50) NULL,
`nachname` varchar(50) NULL,
PRIMARY KEY(`id`)
);

CREATE TABLE `meeting_teilnehmer`
(
`meeting_id` int(11) NOT NULL,
`teilnehmer_id` int(11) NOT NULL
);

ALTER TABLE `meeting_teilnehmer`
ADD CONSTRAINT `recipient_id`
FOREIGN KEY(`meeting_id`, `teilnehmer_id`)
REFERENCES `teilnehmer`(`id`, `id`);

ALTER TABLE `meeting_teilnehmer`
ADD CONSTRAINT `meeting_id`
FOREIGN KEY(`meeting_id`, `teilnehmer_id`)
REFERENCES `meetings`(`id`, `id`);

INSERT INTO teilnehmer (vorname, nachname) VALUES ('Florian', 'Lüttgens');
INSERT INTO teilnehmer (vorname, nachname) VALUES ('Jahan', 'Ketabchy');
INSERT INTO teilnehmer (vorname, nachname) VALUES ('Thomas', 'Koch');
INSERT INTO teilnehmer (vorname, nachname) VALUES ('Ingo', 'Praum');
INSERT INTO teilnehmer (vorname, nachname) VALUES ('Michael', 'Schroeder');
INSERT INTO teilnehmer (vorname, nachname) VALUES ('Uwe', 'Bergefeld');
INSERT INTO teilnehmer (vorname, nachname) VALUES ('Horst', 'Billion');

ALTER TABLE meetings ENGINE=InnoDB;
ALTER TABLE meeting_teilnehmer ENGINE=InnoDB;
ALTER TABLE teilnehmer ENGINE=InnoDB;
nepos
 2007-10-08 13:42
#100478 #100478
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, versuch mal, die Engine direkt beim CREATE TABLE mit einzubauen oder zumindest vor den Anweisungen für deine Foreign Keys anzugeben. Default-Engine ist normal MyISAM und da werden die Foreign-Key-Anweisungen einfach weggeworfen, wenn ich das noch richtig im Kopf habe.

Daneben kann man normal die Foreign Keys gleich im CREATE TABLE mit unterbringen. Das musst du nicht separat via ALTER TABLE machen.
pq
 2007-10-08 14:55
#100487 #100487
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code: (dl )
show create table meeting_teilnehmer
bitte
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
FlorianL
 2007-10-08 15:05
#100490 #100490
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> show create table meeting_teilnehmer;
+--------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| meeting_teilnehmer | CREATE TABLE `meeting_teilnehmer` (
`meeting_id` int(11) NOT NULL,
`teilnehmer_id` int(11) NOT NULL,
KEY `meeting_id` (`meeting_id`,`teilnehmer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>



biddesehr :)
pq
 2007-10-08 18:07
#100500 #100500
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
und wenn du das InnoDB gleich beim create angibst, geht es auch nicht?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
nepos
 2007-10-09 10:31
#100532 #100532
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Kleines Zitat aus der MySQL-Doku:
Quote
For storage engines other than InnoDB, MySQL Server parses the FOREIGN KEY syntax in CREATE TABLE statements, but does not use or store it.

Ich verstehe das so, dass, wenn die Tabelle nicht schon beim Einfügen der Foreign Keys mit der InnoDB-Engine läuft, MySQL die Foreign Keys zwar einliest, aber einfach verwirft. Deshalb leg die Tabellen mal gleich als InnoDB-Tabellen an.
FlorianL
 2007-10-09 10:53
#100534 #100534
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Morgen zusammen :)

Ich habs gerade mal ausprobiert, bekomme nun aber beim alter table statement nen fehler raus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
mysql> create database teammeeting;
Query OK, 1 row affected (0.00 sec)

mysql> use teammeeting;
Database changed
mysql> create table meetings
-> (
-> ID INT AUTO_INCREMENT PRIMARY KEY,
-> `author` VARCHAR(64),
-> `startzeit` VARCHAR(64),
-> `endzeit` VARCHAR(64),
-> `thema` TEXT,
-> `aktion` VARCHAR(1),
-> `bearbeitung` VARCHAR(64),
-> `termin` VARCHAR(64),
-> `erstellung` VARCHAR(10)
-> )
-> TYPE=INNODB
-> ;
Query OK, 0 rows affected (0.03 sec)

mysql>
mysql> CREATE TABLE `teilnehmer`
-> (
-> `id` int(11) AUTO_INCREMENT NOT NULL,
-> `vorname` varchar(50) NULL,
-> `nachname` varchar(50) NULL,
-> PRIMARY KEY(`id`)
-> )
-> TYPE=INNODB
-> ;
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> CREATE TABLE `meeting_teilnehmer`
-> (
-> `meeting_id` int(11) NOT NULL,
-> `teilnehmer_id` int(11) NOT NULL
-> )
-> TYPE=INNODB
-> ;
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> ALTER TABLE `meeting_teilnehmer`
-> ADD CONSTRAINT `recipient_id`
-> FOREIGN KEY(`meeting_id`, `teilnehmer_id`)
-> REFERENCES `teilnehmer`(`id`, `id`);
ERROR 1005: Can't create table './teammeeting/#sql-a507e_2e.frm' (errno: 150)
mysql>
mysql> ALTER TABLE `meeting_teilnehmer`
-> ADD CONSTRAINT `meeting_id`
-> FOREIGN KEY(`meeting_id`, `teilnehmer_id`)
-> REFERENCES `meetings`(`id`, `id`);
ERROR 1005: Can't create table './teammeeting/#sql-a507e_2e.frm' (errno: 150)
mysql>


Ok, im Manual nach 1005 gesucht, ergibt:

If MySQL reports an error number 1005 from a CREATE TABLE statement, and the error message string refers to errno 150, this means that the table creation failed because a foreign key constraint was not correctly formed.

Also ist mein Foreign Key schlecht geformt. Aha.
Weiter sagt das Manual:

The syntax of a foreign key constraint definition in InnoDB looks like this:

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

Ich bin gerad noch zu matschig im kopf, wenn ich das mal richtig ans laufen bekommen hab meld ich mich nochma ^^
<< |< 1 2 3 4 >| >> 35 Einträge, 4 Seiten



View all threads created 2007-10-05 14:17.