Изменить таблицу только по идентификатору

#php #mysql

#php #mysql

Вопрос:

Я пытаюсь установить автоматическое увеличение st_id моих таблиц на = 201406001

запрос:

 ALTER TABLE
support_ticket AUTO_INCREMENT=201406001
  

При этом это сработало, и теперь мой «st_id» (AI, первичный ключ) установлен на 201406001, как я и хотел.

Когда я запустил этот запрос, он сказал, что это повлияло на 4 строки, что правильно, потому что в таблице было 4 строки, когда я запускал этот запрос.

Но теперь, когда я пытаюсь обновить статус определенного столбца в одной из этих 4 строк, он не обновляется.

Является ли мой запрос ALTER TABLE неправильным?

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

 ALTER TABLE
support_ticket.st_id AUTO_INCREMENT=201406001
FROM
support_ticket
  

ОШИБКА

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL  server version for the right syntax to use near 'FROM
support_ticket' at line 3
  

Итак, мой вопрос в том, должен ли я придерживаться своего исходного запроса, поскольку он работал, или я должен попытаться заставить 2-й запрос работать?

Кроме того, может ли выполнение этого 1-го запроса быть причиной того, что я не могу обновить свой столбец сейчас?

Я впервые использую ALTER TABLE, поэтому любая помощь будет полезна.

Вот мой код обновления: Форма

 <form method="POST" action="close.php" enctype="multipart/form-data">
<input type="hidden" name="st_id" value="<?php echo escape ($t->st_id); ?>">
<h3>Close this ticket...</h3>
<select name="status">
<option value="<?php echo escape($t->status); ?>">Current Status: OPEN</option>
<option value="0">CLOSE</option>
</select>
<input type="submit" value="CLOSE"><input type="button" value="Cancel" onclick="window.location = '/admin/maintenance/'">
</form>
  

Сценарий действия:

 include($_SERVER['DOCUMENT_ROOT'] . "/core/init.php");

$st_id = $_POST['st_id'];

$status = $_POST['status'];

$updatestatus = DB::getInstance()->UPDATE('support_ticket', $st_id, array(
    'status' => $status,
));


echo "The ticket was successfully closed.<br />
  

Решение моей проблемы с ОБНОВЛЕНИЕМ:
Наконец-то получил его для обновления этим:

 $st_id = $_POST['st_id'];

$status = $_POST['status'];

$updatestatus = DB::getInstance()->query("UPDATE `support_ticket` SET `status` = $status WHERE `st_id` = $st_id");
  

Комментарии:

1. Мой st_id является единственным авто_инкрементом в таблице

2. @user0000000 может ли выполнение запроса повлиять на мою способность обновлять столбцы? Я на 99% уверен, что мой код обновления верен.

3. вопрос 2) вы хотите установить st_id = 201406001?

4. @user0000000 смотрите в верхней части страницы для ОБНОВЛЕНИЯ

5. Тот, который выдает вам ошибку, разве это не должно быть похоже на ALTER TABLE tablename MODIFY COLUMN column_name... ?

Ответ №1:

Кажется, что пробная версия автоматически увеличивается в зависимости от года или месяца. Вы можете использовать пользовательские значения AUTO_INCREMENT MySQL следующим образом: (сначала прочитайте статью)

Я изменил функцию getNextCustomSeq на строку:

 SET @ret = (SELECT concat(sSeqGroup,'-',lpad(nLast_val,6,'0')));
  

Для

 SET @ret = (SELECT concat(sSeqGroup,lpad(nLast_val,3,'0')));
  

Затем я создаю таблицу, и триггеры следуют:

 CREATE TABLE ticket(
  id int not null primary key auto_increment,
  autonum int not null  
);

DELIMITER $$
CREATE TRIGGER ticket_autonums_bi BEFORE INSERT ON ticket
FOR each ROW
BEGIN
   SET NEW.autonum = getNextCustomSeq(date_format(now(),'%Y%m'),date_format(now(),'%Y%m'));
END$$
delimiter ;
  

Примечание: функция date_format(now(),'%Y%m') вернет текущий год и mont как «201406»

Теперь вставьте некоторые значения:

 insert into ticket(id) 
values (null),(null),(null),(null),(null),
(null),(null),(null),(null),(null);
  

Выберите вставленные данные:

 mysql> select * from ticket;
 ---- ----------- 
| id | autonum   |
 ---- ----------- 
|  1 | 201406001 |
|  2 | 201406002 |
|  3 | 201406003 |
|  4 | 201406004 |
|  5 | 201406005 |
|  6 | 201406006 |
|  7 | 201406007 |
|  8 | 201406008 |
|  9 | 201406009 |
| 10 | 201406010 |
 ---- ----------- 
10 rows in set (0.00 sec)
  

Комментарии:

1. с этого момента в начале каждого месяца нам придется запускать этот запрос ALTER TABLE, чтобы присвоить st_id новый st_id для этого месяца. Т.Е. в следующем месяце мы запустим его снова, и это будет 201407001 = 2014 Год 07 Месяц 001 Номер билета. Читая это, вы говорите, что мыможно ли автоматически генерировать st_id каждый месяц для обновления года / даты / 001? Если это так, это было бы очень полезным решением, поэтому нам не нужно вручную делать это каждый месяц. К вашему сведению, это для системы обращений в службу поддержки. Вот почему нам нужен такой набор st_id. Мы используем его для запроса #

Ответ №2:

ALTER TABLE ... AUTO_INCREMENT=201406001 только означает, что следующее сгенерированное значение AI будет этим значением. Это не изменяет значение идентификатора ни в одной из текущих строк данных в таблице.

Сообщение «Затронутые строки» означало, что он выполнил копирование таблицы как часть ALTER TABLE. Некоторые старые версии MySQL наивно копировали все строки в таблице, даже если вы не думали, что это необходимо для изменения метаданных.

Поэтому, если вы попытаетесь UPDATE ... WHERE id=201406001 , это не будет применяться к вашим существующим строкам.

Комментарии:

1. Итак, вы говорите, что из-за того, что я запустил этот запрос, я не могу обновить существующие строки?

2. Я говорю, что идентификаторы существующих строк не изменились в результате изменения таблицы, поэтому вам придется использовать «старые» значения в предложении WHERE, а не любое значение 201406001 или больше.

Ответ №3:

При ALTER этом вы обновляете описание таблицы (т.Е. Имена столбцов, значения для автоинкремента).

Если вы хотите обновить значения таблицы, вы должны использовать UPDATE . ie:

 UPDATE support_ticket SET status = 'closed' WHERE id = 1234;
  

Если вы новичок в SQL, взгляните на w3schools.com . у них есть несколько руководств (http://www.w3schools.com/sql/sql_update.asp )

Комментарии:

1. Обновил ее, выполнив следующее: Мое решение для обновления см. вверху. @chresse