Wowbagger: MySQL: wie definiert man (primär)schlüssel?

Hi leute,

obwohl ich jetzt das komplette handbuch abgegrast habe (bei 'little idiot' - paßt doch! *G*), bin ich nicht auf die antwort zu dieser frage gestoßen (da stand nur lapidar: "Das kann man zu einem späteren zeitpunkt noch festlegen..." na _super_! *grummel*)

Ich habe zwar im MySQL Administrator für Win32 eine funktiuon gefunden, mit der man keys definieren kann (unter table maintenance), aber die scheint einen bug zu haben :(
Wie also kann ich das mit dem kommandozeilen-tool 'mysql' regeln ?(was mir eigentlich auch lieber wäre)

Danke und bis denn dann
/*,*/
Wowbagger

  1. Hi leute,

    obwohl ich jetzt das komplette handbuch abgegrast habe (bei 'little idiot' - paßt doch! *G*), bin ich nicht auf die antwort zu dieser frage gestoßen (da stand nur lapidar: "Das kann man zu einem späteren zeitpunkt noch festlegen..." na _super_! *grummel*)

    Ich habe zwar im MySQL Administrator für Win32 eine funktiuon gefunden, mit der man keys definieren kann (unter table maintenance), aber die scheint einen bug zu haben :(
    Wie also kann ich das mit dem kommandozeilen-tool 'mysql' regeln ?(was mir eigentlich auch lieber wäre)

    Also, wenn du sie nachträglich anfügen willst mit

    ALTER TABLE tbl_name ADD INDEX index_name (index_col_name,...)

    Wenn du ihn gleich beim erstellen haben willst

    CREATE TABLE shop (
    article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
    dealer  CHAR(20)                 DEFAULT ''     NOT NULL,
    price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
    PRIMARY KEY(article, dealer));

    oder

    mysql> CREATE TABLE test (
           name CHAR(200) NOT NULL,
           KEY index_name (name(10)));

    1. Hi Erik,

      danke erstmal für den tip :-)
      Ich habe da noch ein spezielle problem, welches man mit MySQL bestimmt gut automatisieren könnte, ich aber nicht weis, wie man das ganze anpacken soll.

      Gibt es z.b. 'auto-wert'-felder, wie es sie unter Access gibt? Der punkt ist folgender: Ich habe eine relativ umfangreiche text-datenbank (also einfach eine liste von einträgen in form eines ASCII-files), welche ich nach mySQL portieren möchte. Wie das prinzipiell funkt weis ich, nur möchte ich innerhalb der mySQL-db gerne noch ein key-feld haben, dessen wert automatisch (z.b. batch-gesteuert) beim import hochgezählt wird, so daß alle aus der ASCII-datei stammenden einträge durchnummeriert werden, also:

      ASCII  ----->  mySQL-DB
      Hallo          1 Hallo
      Welt           2 Welt
      Das            3 Das
      ist            4 ist
      ein            5 ein
      Test           6 Test

      Ich glaube ganz sicher,daß sowas mit mySQL kein problem sein dürfte, aber - wie gesagt - ich weis nicht, wo ich da ansetzen soll :(

      Wäre toll, wenn du oder wer auch immer sonst *G* dazu eine idee hätte.

      Danke nochmal und bis denn
      /*,*/
      Wowbagger

      1. Hi Erik,

        danke erstmal für den tip :-)
        Ich habe da noch ein spezielle problem, welches man mit MySQL bestimmt gut automatisieren könnte, ich aber nicht weis, wie man das ganze anpacken soll.

        Gibt es z.b. 'auto-wert'-felder, wie es sie unter Access gibt? > Danke nochmal und bis denn

        Ich hab da ein kleines Testscript für dich .... also dieses autoincrement betreffend, das ist = autowert in Access

        create database suppendosen;
        connect dosensuppen;
        create table 250gr_dosen (250gr_id int auto_increment primary key, name char(50));
        create table 500gr_dosen (500gr_id int auto_increment primary key, name char(50));
        create table 1000gr_dosen (1000gr_id int auto_increment primary key, name char(50));

        Das Feld id wird von 1 immer hochgezählt

        /*,*/
        Wowbagger

        Gruß
        Thomas

        1. Hi Erik,

          danke, ich glaube mit der info komm' ich jetzt ganz gut weiter :-)

          so long...
          /*,*/
          Wowbagger

    2. Hi Erik,

      Also, wenn du sie nachträglich anfügen willst mit

      »»  ALTER TABLE tbl_name ADD INDEX index_name (index_col_name,...)

      Das Thema interessiert mich (angesichts meiner nicht vorhandenen MySQL-Kenntnisse):
      Meines Wissens ist ein Index mitnichten dasselbe wie ein Primärschlüssel. Dein nachträglich angelegter Index ist ja noch nicht mal UNIQUE.
      Insofern würde ich auch die Aussage, man könne einen Primärschlüssel auch nachträglich noch definieren, mit äußerster Vorsicht genießen: Was ist, wenn die entsprechenden Feldwerte eben gerade nicht eindeutig sind?

      CREATE TABLE shop (
      article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
      dealer  CHAR(20)                 DEFAULT ''     NOT NULL,
      price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
      PRIMARY KEY(article, dealer));

      Das hingegen kommt mir schon viel bekannter vor.

      1. Hi Erik,

        Also, wenn du sie nachträglich anfügen willst mit
        »»  ALTER TABLE tbl_name ADD INDEX index_name (index_col_name,...)

        Das Thema interessiert mich (angesichts meiner nicht vorhandenen MySQL-Kenntnisse):
        Meines Wissens ist ein Index mitnichten dasselbe wie ein Primärschlüssel. Dein nachträglich angelegter Index ist ja noch nicht mal UNIQUE.
        Insofern würde ich auch die Aussage, man könne einen Primärschlüssel auch nachträglich noch definieren, mit äußerster Vorsicht genießen: Was ist, wenn die entsprechenden Feldwerte eben gerade nicht eindeutig sind?

        Ja, Index, Primary Key und Unique sind schon ein paar verschiedene Sachen.

        Unique bedeutet, daß jedes Element eindeutig sein muß. Verwendet man meist dazu, um z. B. jedem Datensatz eine eindeutige Nummer zu geben.

        Primary Key ist sozusagen ein Unique über mehere Spalten. Damit kann man Datensätze eindeutig zuordnen. Wenn man z. B. ne Tabelle mit Vorname, Nachname, Telefonnummer hat, kann ich dort 2 Leute eintragen, die den gleichen Vornamen und Nachnamen haben. Wenn ich nen Primary Key über Vorname und Nachname lege, und dann nach Vorname "Erik" und Nachname "Tews" suche, dann bekomme ich genau einen Datensatz, oder auch keinen. Aber ich kann nicht 2 Leute mit gleichem Namen in der Datenbank haben.

        Index bedeutet dann halt nur, daß man damit Suchanfragen beschleunigen kann. (Und leider auch nicht alle, *schief*, nur welche mit where X = "y" oder where X like "x%", und noch so ein paar ähnliche. Aber keine wie where X like "%y%".)