it-swarm.com.de

Verwendung von 2 Auto-Inkrement-Spalten in MySQL phpmyadmin

Ist es möglich, 2 automatische Inkrementwerte zu verwenden?

  • Eins ab 0
  • Ein weiterer ab 4000400

Bitte hilf mir

6
user2106221

Nein, das kannst du nicht. Nicht sofort einsatzbereit. Mögliche Problemumgehungen:

  1. Trigger (ein AFTER INSERT Trigger).

    Nachteile:

    • Einfaches Entsetzen. Kommt mit all den anderen Nachteilen von Triggern, wie Wartung und Debugging von Albträumen.

    Vorteile:

    • Sie können FOREIGN KEY - Einschränkungen haben, die auf diese Spalte verweisen.
    • Sie können die erste und die zweite ID-Spalte einzeln aktualisieren.
  2. Ansichten. Wenn Sie nur einen Wert haben, der immer +4000400 Des ersten automatisch inkrementierten Werts ist, können Sie eine Ansicht verwenden. Speichern Sie diesen Wert also grundsätzlich überhaupt nicht. Berechnen Sie ihn einfach, wenn Sie ihn benötigen:

        CREATE VIEW 
            tablex_with_2nd_AI AS
        SELECT 
            tablex_id,
            colA,                                 -- other columns
            --                                    -- you need
            tablex_ix + 4000400  AS second_id
        FROM 
            tablex ;
    

    Nachteile:

    • Sie können keine FOREIGN KEY - Einschränkung haben, die auf diese (virtuelle) Spalte verweist.

    Vorteile:

    • Spart Platz. Etwas schnellere Einsätze.
  3. Tu das nicht habe überhaupt keine zweite automatisch inkrementierte Spalte. Benötigen Sie wirklich einen zweiten automatisch inkrementierten Wert? Wozu? Eine Beschreibung des tatsächlichen Problems, das Sie lösen möchten, würde anderen helfen, Ihnen besser zu helfen. Ich denke, Sie haben hier nur erzählt, wie Sie versucht haben, ein Problem zu lösen, und nicht, was das eigentliche Problem ist.

6
ypercubeᵀᴹ

Ich habe gute und schlechte Nachrichten

GUTE NACHRICHTEN

Sie können mehrere auto_increment-Werte verwenden

SCHLECHTE NACHRICHTEN

Zwei Dinge:

  1. Es ist nur für die MyISAM Storage Engine verfügbar
  2. Es ist nur ein numerischer Wert für auto_increment zulässig. Jedem auto_increment muss eine Spalte zugeordnet sein, um die Eindeutigkeit von anderen auto_increment-Werten in derselben Tabelle zu definieren.

Ich habe das schon mal besprochen

Hier ist eine Beispieltabelle

USE test
DROP TABLE IF EXISTS stores;
CREATE TABLE stores
(
    store_type int not null,
    id int not null auto_increment,
    store_name varchar(128) not null,
    PRIMARY KEY (store_type,id)
) ENGINE=MyISAM;

Hier sind Beispieldaten

INSERT INTO stores (store_type,store_name) VALUES
(1,'Red Lobster'),(1,'Olive Garden'),
(2,'ShopRite'),(2,'PathMark'),(2,'Wegman''s'),
(3,'McDonald''s'),(3,'Wendy''s'),(3,'Burger King'),
(1,'Ruby Tuesdays'),(1,'TGI Fridays'),
(4,'BJs'),(4,'Costco'),(1,'Bennigan''s');

Laden wir es

mysql> USE test
Database changed
mysql> DROP TABLE IF EXISTS stores;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE stores
    -> (
    ->     store_type int not null,
    ->     id int not null auto_increment,
    ->     store_name varchar(128) not null,
    ->     PRIMARY KEY (store_type,id)
    -> ) ENGINE=MyISAM;
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT INTO stores (store_type,store_name) VALUES
    -> (1,'Red Lobster'),(1,'Olive Garden'),
    -> (2,'ShopRite'),(2,'PathMark'),(2,'Wegman''s'),
    -> (3,'McDonald''s'),(3,'Wendy''s'),(3,'Burger King'),
    -> (1,'Ruby Tuesdays'),(1,'TGI Fridays'),
    -> (4,'BJs'),(4,'Costco'),(1,'Bennigan''s');
Query OK, 13 rows affected (0.00 sec)
Records: 13  Duplicates: 0  Warnings: 0

mysql>

Schauen Sie sich nun die Daten an:

mysql> SELECT * FROM stores;
+------------+----+---------------+
| store_type | id | store_name    |
+------------+----+---------------+
|          1 |  1 | Red Lobster   |
|          1 |  2 | Olive Garden  |
|          2 |  1 | ShopRite      |
|          2 |  2 | PathMark      |
|          2 |  3 | Wegman's      |
|          3 |  1 | McDonald's    |
|          3 |  2 | Wendy's       |
|          3 |  3 | Burger King   |
|          1 |  3 | Ruby Tuesdays |
|          1 |  4 | TGI Fridays   |
|          4 |  1 | BJs           |
|          4 |  2 | Costco        |
|          1 |  5 | Bennigan's    |
+------------+----+---------------+
13 rows in set (0.00 sec)

mysql>

Schauen Sie sich nun die Daten an, die nach den Spalten PRIMARY KEY sortiert sind

mysql> SELECT * FROM stores ORDER BY store_type,id;
+------------+----+---------------+
| store_type | id | store_name    |
+------------+----+---------------+
|          1 |  1 | Red Lobster   |
|          1 |  2 | Olive Garden  |
|          1 |  3 | Ruby Tuesdays |
|          1 |  4 | TGI Fridays   |
|          1 |  5 | Bennigan's    |
|          2 |  1 | ShopRite      |
|          2 |  2 | PathMark      |
|          2 |  3 | Wegman's      |
|          3 |  1 | McDonald's    |
|          3 |  2 | Wendy's       |
|          3 |  3 | Burger King   |
|          4 |  1 | BJs           |
|          4 |  2 | Costco        |
+------------+----+---------------+
13 rows in set (0.00 sec)

mysql>

Versuche es !!!

UPDATE 26.02.2013 12:00 EST

Erweitern wir die SuperMarkets (store_type 2), indem wir 4000400 zu den id -Werten hinzufügen

mysql> UPDATE stores SET id = id + 4000400 WHERE store_type = 2;
Query OK, 3 rows affected (0.02 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> SELECT * FROM stores ORDER BY store_type,id;
+------------+---------+---------------+
| store_type | id      | store_name    |
+------------+---------+---------------+
|          1 |       1 | Red Lobster   |
|          1 |       2 | Olive Garden  |
|          1 |       3 | Ruby Tuesdays |
|          1 |       4 | TGI Fridays   |
|          1 |       5 | Bennigan's    |
|          2 | 4000401 | ShopRite      |
|          2 | 4000402 | PathMark      |
|          2 | 4000403 | Wegman's      |
|          3 |       1 | McDonald's    |
|          3 |       2 | Wendy's       |
|          3 |       3 | Burger King   |
|          4 |       1 | BJs           |
|          4 |       2 | Costco        |
+------------+---------+---------------+
13 rows in set (0.00 sec)

mysql>

Fügen wir A & P als ein weiterer Supermarkt

mysql> INSERT INTO stores (store_type,store_name) VALUES (2,'A & P');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM stores ORDER BY store_type,id;
+------------+---------+---------------+
| store_type | id      | store_name    |
+------------+---------+---------------+
|          1 |       1 | Red Lobster   |
|          1 |       2 | Olive Garden  |
|          1 |       3 | Ruby Tuesdays |
|          1 |       4 | TGI Fridays   |
|          1 |       5 | Bennigan's    |
|          2 | 4000401 | ShopRite      |
|          2 | 4000402 | PathMark      |
|          2 | 4000403 | Wegman's      |
|          2 | 4000404 | A & P         |
|          3 |       1 | McDonald's    |
|          3 |       2 | Wendy's       |
|          3 |       3 | Burger King   |
|          4 |       1 | BJs           |
|          4 |       2 | Costco        |
+------------+---------+---------------+
14 rows in set (0.00 sec)

mysql>

Sieht so aus, als könnte es für dich funktionieren !!!

3
RolandoMySQLDBA

Ich bin gerade auf dieses Problem gestoßen und möchte zu den Antworten beitragen. Ich habe Ypercubes Antwort verwendet, um es zu lösen, aber auf eine etwas andere Art und Weise. Zunächst jedoch

Warum benötigen Sie neben ID die zweite Spalte für das automatische Inkrementieren?

Es gibt einige Objekte, deren Menge sehr sensible Unternehmensinformationen sein kann. Zum Beispiel möchte ich vielleicht nicht user_id 37 um vorzuschlagen, dass ich nur 37 Benutzer auf meiner Website habe. Anzahl der Ansprüche, Anzahl der Käufe, Anzahl der guten oder schlechten Dinge, die Benutzer, Wettbewerber oder Aufsichtsbehörden nicht wissen sollen.

Zumindest in meinem Fall ist es jedoch nützlich, diesen Objekten eine eindeutige öffentlich verfügbare Nummer zuzuweisen, damit ich sie mit Benutzereingaben einfacher verwalten kann. Zum Beispiel hat diese Frage auf SE eine Nummer 35449 und ich kann sie erhalten, indem ich diese Nummer in den Browser eingebe: https://dba.stackexchange.com/questions/35449

Und schließlich möchte ich keinen komplexen Overhead erstellen, der versucht, IDs zu verschleiern. Das automatische Inkrementieren einer Zahl größer als ID reicht aus.

Das ist also das Problem. Die Antwort von Ypercube hat eine ziemlich coole Lösung. Fügen Sie einfach eine Konstante zur ID hinzu. Nur ich habe es in PHP in meinem Fall mit einer zusätzlichen Abfrage gemacht und es in eine separate Funktion gestellt, damit ich es leicht verfolgen kann und es nicht eng mit dem Rest von SQL gekoppelt wird Es ist langsamer, aber für mich einfacher zu handhaben.

Beachten Sie, wenn Sie versuchen, die Menge von etwas Negativem zu verringern, wie complaint_id oder refund_id, subtrahieren Sie nicht, da Sie möglicherweise negativ werden. Fügen Sie einfach eine große Zufallszahl in Milliarden + ohne aufeinanderfolgende Nullen hinzu (z. B. id + 159035466234) das macht deutlich, dass es nichts mit der Menge dieser Objekte zu tun hat.

0
Arthur Tarasov

Schauen Sie sich die Registerkarte Trigger an - Sie sollten in der Lage sein, einen Trigger zu erstellen, um eine zweite Spalte für das automatische Inkrementieren basierend auf einer Einfügung zu aktualisieren.

    CREATE TABLE IF NOT EXISTS test2 (
    id          int(11) NOT NULL AUTO_INCREMENT,
    another_id      int(11) ,
    blah        varchar(250),
    PRIMARY KEY (`id`)  
)   ENGINE=MyISAM  DEFAULT CHARSET=latin1 ; 

Der Trigger sollte die Spalte 'another_id' (die Sie auf 40004000 gesetzt haben) erhöhen, wenn eine Zeile in die Tabelle eingefügt wird

0
acutesoftware