Уникальные идентификаторы в MySQL? - PullRequest
2 голосов
/ 06 апреля 2011

Поэтому я работаю над довольно небольшим сценарием для компании, в которой я работаю, чтобы помочь нам лучше управлять нашими серверами. Я не использую MySQL слишком часто, поэтому я немного запутался в выборе лучшего пути.

Я делаю что-то вроде этого ...

$sql = "CREATE TABLE IF NOT EXISTS Servers
    (
        MachineID int NOT NULL AUTO_INCREMENT,
        PRIMARY KEY(MachineID),
        FirstName varchar(32),
        LastName varchar(32),
        Datacenter TINYINT(1),
        OperatingSystem TINYINT(1),
        HostType TINYINT(1)
    )";

$result = mysql_query($sql,$conn);
check ($result);

$sql = "CREATE TABLE IF NOT EXISTS Datacenter
    (
        DatacenterID int NOT NULL AUTO_INCREMENT,
        PRIMARY KEY(DatacenterID),
        Name varchar(32),
        Location varchar(32)
    )";

$result = mysql_query($sql,$conn);
check ($result);

По сути, внутри таблицы Servers я буду хранить индекс записи в другой таблице. Меня беспокоит то, что если мы удалим одну из этих записей, она испортит автоматически увеличенные индексы и потенциально может вызвать много неправильных данных.

Чтобы объяснить лучше, скажем, первый сервер, который я добавляю, значение Datacenter равно 3 (который является DatacenterID), и мы позже удалим Datacenter с идентификатором 1 (DatacenterID).

Есть ли хороший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 06 апреля 2011

Автоинкремент влияет только на вставку новых строк в таблицу. Таким образом, вы вставляете три записи в базу данных, и им присваиваются идентификаторы 1, 2 и 3. Позже вы удаляете идентификатор 1, но записи с идентификаторами 2 и 3 остаются без изменений. Это ничего не говорит о каких-либо записях сервера, которые могут пытаться ссылаться на запись базы данных с идентификатором 1, хотя сейчас она отсутствует.

1 голос
/ 06 апреля 2011

как сказал Пол, безопасно удалить старый ряд и добавить новый позже. Автоинкрементный индекс не будет затронут удалением.

Но я бы предложил вместо их удаления просто добавить столбец «status» и установить 0, подразумевая, что они больше не используются, чтобы сохранить любую возможную запись в дБ.

0 голосов
/ 06 апреля 2011

Если вы удалите так, как вы предлагаете, ничего не произойдет.автоинкремент будет просто добавлять следующее по порядку наибольшее число всякий раз, когда добавляется новая запись, и, следовательно, не повлияет на предыдущие записи.

Надеюсь, это поможет.

0 голосов
/ 06 апреля 2011

Servers.Datacenter также должен быть INT, так как вы бы хранили DataCenterID в этом поле.Тогда ничто не будет перепутано, если вы удалите центр обработки данных из второй таблицы.

...