MySQL - auto decrementing value

后端 未结 5 1701
孤城傲影
孤城傲影 2021-01-06 04:47

Let\'s say that I\'ve got a table, like that (id is auto-increment):

id | col1 | col2
1  | \'msg\'| \'msg\'
2  | \'lol\'| \'lol2\'
3  | \'xxx\'| \'x\'


        
相关标签:
5条回答
  • 2021-01-06 05:02

    You shouldn't do that.
    Do not take an auto-incremented unique identifier as an ordinal number.
    The word "unique" means that the identifier should be stuck to its row forever.

    There is no connection between these numbers and enumerating.
    Imagine you want to select records in alphabetical order. Where would your precious numbers go? A database is not like an ordered list, as you probably think. It is not a flat file with rows stored in a predefined order. It has totally different ideology. Rows in the database do not have any order. And will be ordered only at select time, if it was explicitly set by ORDER BY clause.
    Also, a database is supposed to do a search for you. So you can tell that with filtered rows or different ordering this auto-increment number will have absolutely nothing to do with the real rows positions.

    If you want to enumerate the output - it's a presentation layer's job. Just add a counter on the PHP side.

    And again: these numbers supposed to identify a certain record. If you change this number, you'd never find your record again.

    Take this very site for example. Stack Overflow identifies its questions with such a number:

    stackoverflow.com/questions/3132439/mysql-auto-decrementing-value

    So, imagine you saved this page address to a bookmark. Now Jeff comes along and renumbers the whole database. You press your bookmark and land on the different question. Whole site would become a terrible mess.

    Remember: Renumbering unique identifiers is evil!

    0 讨论(0)
  • 2021-01-06 05:09

    It is not good practice to change the value of an auto_increment column. However, if you are sure you want to, the following should help.

    If you are only deleting a single record at a time, you could use a transaction:

    START TRANSACTION;
    DELETE FROM table1 WHERE id = 2;
    UPDATE table1 SET id = id - 1 WHERE id > 2;
    COMMIT;
    

    However if you delete multiple records, you will have to drop the column and re-add it. It is probably not guaranteed to put the rows in the same order as previously.

    ALTER TABLE table1 DROP id;
    ALTER TABLE table1 ADD id INTEGER NOT NULL AUTO_INCREMENT;
    

    Also, if you have data that relies on these IDs, you will need to make sure it is updated.

    0 讨论(0)
  • 2021-01-06 05:16

    I think there is no way to this directly. Maybe you can do "update" operation. But you must do it for all record after your deleted record. It is very bad solution for this.

    0 讨论(0)
  • 2021-01-06 05:16

    Why using an auto-increment if you want to change it manually?

    0 讨论(0)
  • 2021-01-06 05:20

    You can renumber the whole table like this:

    SET @r := 0;
    UPDATE  mytable
    SET     id = (@r := @r + 1)
    ORDER BY
            id;
    
    0 讨论(0)
提交回复
热议问题