Можно ли добавить запись между остальными в MySQL? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть база данных в mysql и таблица Animals, я использую это условие для добавления записей новостей.

public function create()
{
   $animals = Animals::all();
   $last_animal_id = collect($animals)->last();

   if ($last_animal_id->id == $last_animal_id->id) {

     $last_animal_id->id = $last_animal_id->id + 1;

   } else {

      return false;
    }

   return view('animal.create-animals')->with('last_animal_id', $last_animal_id);
}

Я работаю в laravel и php , и этомой контроллер 'AnimalsController' , условие добавляет +1 к последнему идентификатору, зарегистрированному в таблице.

Например, у меня есть 4 записи, и я удаляю последнюю запись без моего условия, после того как я добавлю новую запись, новая запись примет значение 6.

И этоПричина, по которой я добавляю новые записи вручную, с этим условием, условие поиска последнего идентификатора и добавление +1 к последнему идентификатору, а не +2, если у меня нет этого условия. Не напрямую , я передаю значение на вход, а затем отправляю форму в своем представлении.

Можно добавить +1 идентификатор в таблицу, если я удалю запись всредний или до последней записи?Как объясняется в следующем примере:

Столовые животные

/*NOTE: The field 'id' HAVE THE FOLLOWING ATTRIBUTES:
AUTO_INCREMENT, IS 'NOT NULL','PRIMARY KEY', AND HIS TYPE IS 'INT'*/

id|name   |class

1 |Dog    |Mammal
2 |Cat    |Mammal
3 |Sparrow|Bird
4 |Whale  |Mammal
5 |Frog   |Amphibian
6 |Snake  |Reptile

Затем я удаляю id, 2, и 3.

В дополнение к уже существующему условию я хотел бы создать еще одно условие, позволяющее добавлять новые записи среди других, только если между ними отсутствуют записи.,

Используя предыдущий пример:

Я сказал, что я удалю id 2 и 3, верно?Новое условие должно позволять снова создавать записи с id 2 и 3 между записями с id 1 и 4.

Если я удаляю другую запись, условие должно выполнять ту же функцию.Конечно, заменив записи соответствующими id, которые были ранее удалены.

Для более подробной информации: я использую форму для создания новых животных в таблице «Животные», как я ранее говорил вНапример, я буду удалять записи с идентификаторами 2 и 3, затем, если условие в моем контроллере и моя форма, на мой взгляд, будут работать правильно, тогда я могу снова добавить животное с идентификатором 2, а затем в новую форму добавитьснова животное с идентификатором 3.

Таким образом, если мой вопрос не был понят очень хорошо, или вы подумали, что моя функция должна добавлять записи одновременно, вы поняли это неправильно, потому что это нефункция, которую я хотел бы сделать в функции.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

От Тадмана есть действительно хороший ответ о последствиях вашего решения.

Чтобы дать вам альтернативу собственному решению, вы можете сделать что-то вроде этого ...

Сначала создайте столбец order, int.

Их, вместо того, чтобы смотреть на последнее значение id, сделайте это ...

$highestOrder = Animal::max('order');

А потом "поднимите его" ... :-) Просто идея.

Кстати: чтобы дать вам больше возможностей, вы можете посмотреть прямо в таблицу:

DB::table('animals')->max('order');

... но я бы не стал этого делать в этом случае.Класс модели является лучшим «шлюзом» для этой информации, а не фасадом БД напрямую.

0 голосов
/ 10 октября 2018

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

Если порядок важен, создайте для этой цели столбец, например, столбец с именем position или что-то подобное.Этим вы можете свободно манипулировать, не заботясь об изменении отношений.

Как правило, ваше значение id должно быть:

  • Всегда заполнено (например, NOT NULL)
  • Целое число (например, INT или BIGINT)
  • Установить в качестве основного ключа (например, PRIMARY KEY)
  • Сгенерировано автоматически (например, AUTO_INCREMENT)
  • Никогда не изменялось, он постоянно назначен
  • Никогда не перерабатывается и не используется для другой записи

Переработка id значений - это то, как вы создаете огромные проблемы с безопасностью.Для пользователя слишком легко «унаследовать» все данные, которые пришли со старым значением идентификатора пользователя, которое вы переработали.Самое безопасное - никогда не использовать эти значения никогда.

Это просто идентификаторы.Забудьте о дырах или отсутствии заказа.Любая производственная база данных будет содержать множество интересных шаблонов, которые неизбежны, но это не имеет значения.

Единственное исключение из этого - при создании начальных баз данных.Здесь вы можете суетиться по поводу порядка, чтобы все было организовано так, как вы хотите, потому что за до вы вставляете данные в базу данных.

В конце дня вы захотите убедитьсячто:

  • Эти цифры не переполняются (например, INT таблица с ключами на 2,1 миллиарда)
  • Эти цифры не предоставляются пользователям таким образом, чтобы сделать возможнымперечислите свою таблицу (например, значение идентификатора в URL)

Просто представьте, что они внутренние идентификаторы, например, серийный номер, и все будет в порядке.Фактически, MySQL теперь поддерживает SERIAL как тип данных, по этой причине это псевдоним для BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, который является хорошим значением по умолчанию для систем, разработанных в 2018 году.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...