it-swarm-eu.dev

Jak používat 2 sloupce automatického přírůstku v MySQL phpmyadmin

Je možné použít 2 hodnoty automatického přírůstku?

  • Jeden od 0
  • Další z 4000400

Prosím pomozte mi

6
user2106221

Ne, nemůžete. Ne mimo krabici. Možná zástupná řešení:

  1. Triggers (a AFTER INSERT trigger).

    Nevýhody:

    • Obyčejná hrůza. Přichází se všemi ostatními nevýhodami spouště, jako je údržba a ladění nočních můr.

    Výhody:

    • Můžeš mít FOREIGN KEY omezení, která odkazují na tento sloupec.
    • První a druhý sloupec id můžete aktualizovat samostatně.
  2. Zobrazení. Pokud jste pouze hodnota, která je vždy +4000400 první automaticky zvýšené hodnoty, můžete použít pohled, takže v zásadě tuto hodnotu neukládat, pouze ji vypočítat, když ji potřebujete:

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

    Nevýhody:

    • Nemůžete mít FOREIGN KEY omezení, které odkazuje na tento (virtuální) sloupec.

    Výhody:

    • Šetří místo. Mírně rychlejší vložky.
  3. Nedělejte to Nemáte vůbec druhý sloupec s automatickým zvyšováním. Opravdu potřebujete druhou hodnotu automaticky zvýšenou? Na co? Popis skutečného problému, který se snažíte vyřešit, by pomohl ostatním lépe vám pomoci. Myslím, že jste zde jen řekli, jak jste se pokusili vyřešit problém, a ne jaký je skutečný problém.

6
ypercubeᵀᴹ

Mám dobré a špatné zprávy

DOBRÉ ZPRÁVY

Můžete zadat více hodnot auto_increment

ŠPATNÉ ZPRÁVY

Dvě věci:

  1. Je k dispozici pouze pro MyISAM Storage Engine
  2. Povolena je pouze jedna numerická hodnota auto_increment. Každý auto_increment musí mít přidružený sloupec pro definování jedinečnosti z jiných hodnot auto_increment ve stejné tabulce.

Už jsem o tom mluvil

Zde je ukázková tabulka

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;

Zde jsou ukázková data

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');

Pojďme to načíst

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>

Nyní se podívejte na data:

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>

Nyní se podívejte na data uspořádaná ve sloupcích PRIMARY KEY

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>

Pokusit se !!!

AKTUALIZACE 2013-02-26 12:00 EST

Pojďme rozšířit supermarkety (store_type 2) přidáním 4000400 k hodnotám id

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>

Pojďme přidat A & P jako další SuperMarket

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>

Vypadá to, že to pro vás může fungovat !!!

3
RolandoMySQLDBA

Právě jsem narazil na tento problém a rád bych přispěl k odpovědím. K vyřešení jsem použil Ypercubeovu odpověď, ale trochu jinak. Nejprve však

Proč potřebujete kromě sloupce ID druhý sloupec s automatickým zvyšováním?

Existují některé objekty, jejichž množství mohou být docela citlivé firemní informace. Například možná nechci user_id 37 naznačují, že na svém webu mám pouze 37 uživatelů. Počet reklamací, počet nákupů, počet všeho, co je dobré nebo špatné a které nechcete, aby uživatelé, konkurenti nebo regulátoři věděli.

Přesto je užitečné, alespoň v mém případě, těmto objektům přiřadit jedinečné veřejně dostupné číslo, abych je mohl snadněji spravovat pomocí vstupu uživatele. Například tato otázka na SE má číslo 35449 a mohu ji získat zadáním tohoto čísla do prohlížeče: https://dba.stackexchange.com/questions/35449

A konečně nechci vytvářet žádné složité režie, které by se snažily zatemnit idy. Automaticky se zvýší číslo větší než ID.

To je ten problém. Odpověď Ypercube má docela skvělé řešení, stačí přidat konstantu k id. Udělal jsem to pouze v PHP v mém případě s dalším dotazem a dal jsem ho do samostatné funkce, abych ho mohl snadno sledovat a nedá se pevně spojit se zbytkem SQL) Je to pomalejší, ale snazší se ovládat jako já.

Všimněte si, že pokud se snažíte zmenšit, objevilo se množství něčeho negativního, například complaint_id nebo refund_id, neodečtěte, protože můžete jít do záporu, stačí přidat obrovské náhodné číslo, v miliardách + bez po sobě jdoucích nul (např. id + 159035466234) to objasní, že to nemá nic společného s množstvím těchto objektů.

0
Arthur Tarasov

Podívejte se na kartu triggery - měli byste být schopni vytvořit trigger pro aktualizaci 2. sloupce automatického přírůstku na základě vložení.

    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 ; 

Spouštěč by měl zvýšit sloupec 'other_id' (který jste nastavili na 40004000), když je řádek vložen do tabulky

0
acutesoftware