phpbar.de logo

Mailinglisten-Archive

[php] Foreign Keys erzeugen

[php] Foreign Keys erzeugen

Kristian =?iso-8859-1?Q?K=F6hntopp?= kk_(at)_netuse.de
Tue, 11 May 1999 13:52:05 +0200


Ich habe diese beiden Beispieltabellen:

#
# Table structure for table 'dom'
#
CREATE TABLE dom (
  id int(11),
  domain varchar(127)
);

#
# Dumping data for table 'dom'
#

INSERT INTO dom VALUES (1,'netuse.de');
INSERT INTO dom VALUES (2,'koehntopp.de');

#
# Table structure for table 'host'
#
CREATE TABLE host (
  ip varchar(16),
  hostname varchar(127),
  id int(11)
);

#
# Dumping data for table 'host'
#

INSERT INTO host VALUES ('193.98.110.1','nuki.netuse.de',0);
INSERT INTO host VALUES ('193.102.57.4','white.koehntopp.de',0);
INSERT INTO host VALUES
('192.102.57.3','valiant.koehntopp.de',0);


Ich muß eine große Menge externe Daten in die "host"-Tabelle
laden (etwa 7200 Domains mit entsprechend mehr Rechnern). Ich
kann bereits erfolgreich den folgenden Join ausführen, der genau
das tut, was ich möchte (nur sehr langsam ist):

mysql> select concat("%.", dom.domain) as bla from dom;
+----------------+
| bla            |
+----------------+
| %.netuse.de    |
| %.koehntopp.de |
+----------------+
2 rows in set (0.00 sec)

mysql> select dom.id, domain, hostname from dom, host where
host.hostname like concat("%.", dom.domain);
+------+--------------+----------------------+
| id   | domain       | hostname             |
+------+--------------+----------------------+
|    1 | netuse.de    | nuki.netuse.de       |
|    2 | koehntopp.de | white.koehntopp.de   |
|    2 | koehntopp.de | valiant.koehntopp.de |
+------+--------------+----------------------+
3 rows in set (0.01 sec)

Der Join ist langsam, weil er mit Pattern Matching mit führendem
Wildcard arbeitet, also durch Indices nicht beschleunigt werden
kann. ch möchte jetzt "id"-Werte in "host" so berechnen, daß sie
stattdessen als foreign key zum Join verwendet werden können.

Mein Versuch:

mysql> update host set host.id = dom.id 
> where host.hostname like concat("%.", dom.domain);
ERROR 1109: Unknown table 'dom' in field list

Das scheitert also am "host.id = dom.id"-Part der Query. Wir kann
ich die host.id-Werte korrekt berechnen, sodaß ihre Werte gemäß
den dom.id-Werten gesetzt werden.

Mir ist klar, daß es eine Prozedurale Lösung gibt. Die Frage ist:
Gibt es eine SQL-Lösung für dieses Problem? Wenn nein, warum
nicht?

Kristian
-- 
Kristian Köhntopp, NetUSE Kommunikationstechnologie GmbH
Siemenswall, D-24107 Kiel, Germany, +49 431 386 436 00
Using PHP3? See our web development library at
http://phplib.shonline.de/ (GPL)


php::bar PHP Wiki   -   Listenarchive