Sibprompost.ru

Стройка и ремонт
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как insert создать несколько новых записей на основе записей, уже находящихся в таблице (в Oracle)

Как insert создать несколько новых записей на основе записей, уже находящихся в таблице (в Oracle)?

Я хочу найти строки (записи), которые имеют определенный vlaue (Ы) В столбце (типе), и insert несколько строк (например, 2) на основе этой строки в одной и той же таблице.

Например, в Табе t1 ниже я хочу, чтобы для каждой строки типа ‘S’ были вставлены 2 строки с одинаковыми ID и ценой, новым значением счетчика (никаких особых требований к этому файлу нет, однако счетчик для записей с одинаковыми ID должен быть другим), а тип будет ‘B’.

Это означает,что при вставке 2 строк на основе первой записи в таблице ниже (1,1200,S, 200) значение счетчика новых записей должно отличаться от значений счетчика записей с уже в таблице (1200 и 1201). Итак, в исходной таблице было три записи с типом ‘S’, затем в финальной таблице для каждой из этих записей вводится 2 новые записи с типом ‘B’ и новое значение счетчика:

Выходная таблица t1 будет:

3 ответа

  • Insert запись в таблице на основе столбца в другой таблице (в разработчике Oracle SQL)

Я хочу insert новых записей в таблице Prices (дата, ID1, цена) на основе записей в таблице Headers (дата, ID1, ID2). Если в таблице Headers существует запись, где ее ID2 равен ID1 другой записи в этой таблице, то новая запись должна быть вставлена в таблицу Prices, где ее дата и ID1 взяты из.

В приложении базы данных я хочу вставлять, обновлять и удалять записи в таблице базы данных. Таблица выглядит следующим образом: В этой таблице Ga1_ID является первичным ключом. Предположим, я вставляю 5 записей, как показано в данный момент. Во второй попытке, если я хочу вставить 5 других.

Вам просто нужно дважды сыграть эту команду:

Вам нужна инструкция insert select:

EDIT: Вот утверждение, которое соответствует вашим критериям, упомянутым в вашем замечании ниже. Он получает максимальный счетчик на ID и добавляет к нему число # добавленной записи в ID (1, 2, 3, . )).

СОЗДАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ my_SEQ

ПРИРАЩЕНИЕ НА 1

создать таблицу MY_TABLE1 ( ИДЕНТИФИКАЦИОННЫЙ НОМЕР, номер счетчика(20), тип varchar2(30), номер цены )

insert в my_table1 (идентификатор,счетчик,тип,цена) значения (my_SEQ.nextval,1200,’S’,200);

insert в my_table1 (идентификатор,счетчик,тип,цена) значения (my_SEQ.nextval,1300,’B’,311);

insert в my_table1 (идентификатор,счетчик,тип,цена) значения (my_SEQ.nextval,200,’S’,110);

insert в my_table1 (идентификатор,счетчик,тип,цена) значения (my_SEQ.nextval,299,’B’,329);

выберите * из my_table1

курсор c1 выбирается * из My_table1, где type=’B’;

insert в my_table1 (идентификатор,счетчик,тип,цена)

выберите * из my_table1

выбрано 6 строк.

Так что там в курсоре выберите все строки, где тип =’B’ и insert их обратно с немного измененными значениями! надеюсь, это поможет. вы не можете использовать последовательность, но добавить rec.id+1

  • Oracle SQL триггер вставки новых записей на основе значения столбца вставки

Я пытаюсь создать триггер для таблицы Oracle. Вот требования У меня есть две таблицы книги, копии (книги & копий имеют отношение 1 к n. Каждая книга может иметь от 0 до n экземпляров) Забронировать Стол: CREATE TABLE Book ( book_id INTEGER NOT NULL , isbn VARCHAR2 (20) NOT NULL, publisher_id.

Я пытаюсь insert несколько записей в таблице. Однако некоторые из этих записей могут совпадать с существующими: в таких сценариях эти дубликаты записей вставлять не следует. Вот пример: стол id name number 1 alice 12345 2 bob 67890 id-это автоматическое приращение, в то время как имя и номер-это.

Похожие вопросы:

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

У меня есть таблица Statistic с этими полями Id UserId DateStamp Data также есть таблица User в базе данных, которая имеет поле CreditsLeft (int). Мне нужно создать функцию(назовем ее.

Можно ли узнать, были ли новые записи внесены в таблицу MySQL? Например, в таблице есть 10 записей, а кто-то добавляет 2 новых. Как написать строку php, чтобы обнаружить новые записи (только) и.

Я хочу insert новых записей в таблице Prices (дата, ID1, цена) на основе записей в таблице Headers (дата, ID1, ID2). Если в таблице Headers существует запись, где ее ID2 равен ID1 другой записи в.

В приложении базы данных я хочу вставлять, обновлять и удалять записи в таблице базы данных. Таблица выглядит следующим образом: В этой таблице Ga1_ID является первичным ключом. Предположим, я.

Я пытаюсь создать триггер для таблицы Oracle. Вот требования У меня есть две таблицы книги, копии (книги & копий имеют отношение 1 к n. Каждая книга может иметь от 0 до n экземпляров).

Я пытаюсь insert несколько записей в таблице. Однако некоторые из этих записей могут совпадать с существующими: в таких сценариях эти дубликаты записей вставлять не следует. Вот пример: стол id name.

У меня есть таблица в Oracle 11g с несколькими записями для разных пользователей, я хочу удалить лишние записи, которые старше, из таблицы и сохранить только 5 новых записей для конкретных.

Читайте так же:
Определите относительную погрешность для счетчика

У меня есть таблица А и таблица в, как показано ниже:- Таблица А user_id|sub_category_id|category_id|is_removed 5 |201 |2 |false Таблица B sub_category_id|category_id 101 |1 102 |1 103 |1 201 |2.

Я здесь недавно. Заранее спасибо за ваш совет. Я работаю над приложением, которое будет спрашивать пользователя, сколько предметов они сделали. Пользователь будет вводить номер. Затем мое приложение.

Как мне установить первое значение AutoNumber в Access?

Мне не нужно сбрасывать значение AutoNumber, как в этом вопросе , но я бы хотел сначала установить число в:

Который затем увеличивается как обычно:

Как мне сделать это в Access 2010?

Хотя Access не предлагает эту функцию изначально, это может быть достигнуто с помощью запроса, например:

Это создаст одну таблицу с именем «TableThatIncrements» с одним столбцом с именем «Id». Теперь вы можете использовать редактор таблиц для добавления свойств и / или других столбцов.

в соответствии с вашими потребностями, где x номер начального приращения и y номер для увеличения. Так AUTOINCREMENT(100,5) что даст: 100, 105, 110, 115 и т. Д.

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

Вы можете запустить запрос в Access, выполнив следующие действия:

Перейдите на вкладку «Создать» и нажмите «Дизайн запроса»

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

Перейдите на вкладку «Дизайн» и нажимайте кнопку со стрелкой, пока не появится экран ввода текста. (По умолчанию написано SELECT; ).

Удалите текст по умолчанию и вставьте вышеуказанный запрос.

Нажмите «Выполнить».

1- Создать таблицу1 2- Перейти к созданию ——-> дизайн запроса. 3- Закройте таблицу 4- Перейдите к SQl сверху. 5- мимо этого кода.

ALTER TABLE [TABLE1] ALTER COLUMN [Id] СЧЕТЧИК (8982,1)

На этом веб-сайте есть очень простой способ начать свой автоматический номер с любого числа, которое вы хотите: http://www.fmsinc.com/microsoftaccess/AutoNumber%20Field/Creating.asp

Вы создаете запрос с выражением, которое указывает поле autonumber изменить

«Сначала запустите этот запрос:

INSERT INTO tblName (ID) SELECT 999 AS Expr1

Где tblName — имя таблицы, а ID — имя поля AutoNumber.

Затем выполните второй запрос, чтобы удалить вставленную строку:

УДАЛИТЬ ИЗ tblName WHERE >

(В качестве альтернативы вы можете просто открыть таблицу и вручную удалить введенную строку.)

Теперь следующей записи, добавленной в таблицу, присваивается значение 1000.

Этот метод работает с новой таблицей или с таблицей, у которой AutoNumber еще не достиг значения Seed. (Конечно, поле идентификатора для существующих строк не будет изменено, но последующие строки будут начинаться с 1000.) «

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

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

Google «Access Change Autonumber Start», и вы найдете несколько вариантов для этого. Большинство полагается на создание запроса на добавление для изменения поля.

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

Если вам не хочется создавать запрос на добавление, вы всегда можете настроить таблицу, скопировать и вставить 1000 строк фиктивных данных из Excel, удалять записи до тех пор, пока не доберетесь до номера 1001, и продолжить с этого момента.

ОБНОВЛЕНИЕ: добавление объяснения причины

Причина, по которой для autonumber задано только начало от 1, состоит в том, что поле autonumber предназначено для использования в качестве внутреннего справочного поля, и в хорошей практике работы с базами данных обычно не следует использовать в какой-либо общедоступной форме. Он используется в тех случаях, когда в данной таблице еще нет уникального элемента для создания уникальной записи, по которой можно искать и индексировать таблицу.

Это довольно старая тема, но она по-прежнему отображается в тройке лучших результатов поиска Google.

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

Читайте так же:
Одноструйный сухоходный крыльчатый счетчик

Нет проблем, верно? Что ж, инкремент автонумерации остается за внешним интерфейсом. Таким образом, если рабочая сторона просто увеличила число автонумера на 50, 500 или 5000 номеров, пока администратор работал с копией, то новая рабочая копия будет повторять те же номера и не сможет вводить элементы в эти поля, один в то время, пока это не становится «в чистоте». Скопируйте 50, 500 или 5000 строк данных Excel и попытайтесь вставить их. В каждой строке будет ошибка (не забудьте подавить дальнейшие сообщения, когда она появится), но число автонумеров увеличится на эту величину, и вы в порядке. идти снова. Если вы используете автономные номера таким образом, рекомендуется увеличить число до того, на котором находится производственная база данных, перед тем, как перезаписать ее своей рабочей версией.

Это также способ начать ваш автономный номер со значения, превышающего 1. Как и в прежние времена, когда счетчик посещений страницы устанавливался на 17 479 на вашей домашней странице Geocities, когда на самом деле его посещали только 16 раз. Тобой.

Язык запросов SQL

Система управления базами данных (СУБД) — это отдельная программа, которая работает как сервер, независимо от PHP.
Создавать свои базы данных, таблицы и наполнять их данными можно прямо из этой же программы, но для выполнения этих операций прежде придётся познакомиться с ещё одним языком программирования — SQL.

SQL или Structured Query Language (язык структурированных запросов) — язык программирования, предназначенный для управления данными в СУБД. Все современные СУБД поддерживают SQL.

На языке SQL выражаются все действия, которые можно провести с данными: от записи и чтения данных, до администрирования самого сервера СУБД.
Для повседневной работы совсем не обязательно знать весь этот язык; достаточно ознакомиться лишь с основными понятиями синтаксиса и ключевыми словами. Кроме того, SQL очень простой язык по своей структуре, поэтому его освоение не составит большого труда.

Язык SQL — это в первую очередь язык запросов, а кроме того он очень похож на естественный язык.
Каждый раз, когда требуется прочитать или записать любую информацию в БД, требуется составить корректный запрос. Такой запрос должен быть выражен в терминах SQL.

Например, чтобы вывести на экран все записи из таблицы города , составим такой запрос:

Если перевести этот запрос на язык SQL, то корректным результатом будет:

Теперь напишем запрос на добавление в таблицу города нового города:

Эта команда создаст в таблице ‘города’ новую запись, где полю ‘имя города’ будет присвоено значение ‘Санкт-Петербург’.

С помощью SQL можно не только добавлять и читать данные, но и:

  • удалять и обновлять записи в таблицах;
  • создавать и редактировать сами таблицы;
  • производить операции над данными: считать сумму, получать самое большое или малое значение, и так далее;
  • настраивать работу сервера СУБД.

MySQL

Существует множество различных реляционных СУБД. Самая известная СУБД — это Microsoft Access, входящая в состав офисного пакета приложений Microsoft Office.
Нет никаких препятствий для использования в качестве СУБД MS Access, но для задач веб-программирования гораздо лучше подходит альтернативная программа — MySQL.
В отличие от MS Access, MySQL абсолютно бесплатна, может работать на серверах с Linux, обладает гораздо большей производительностью и безопасностью, что делает её идеальным кандидатом на роль базы данных в веб-разработке.
Подавляющее большинство сайтов и приложений на PHP используют в качестве СУБД именно MySQL.

Установка

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

Последняя версия MySQL доступна для загрузке по ссылке: https://dev.mysql.com/downloads/mysql/
На этой странице следует выбрать «MySQL Installer for Windows» и нажать на кнопку «Download» для загрузки.

В процессе установки запомните директорию, куда вы устанавливаете MySQL (скрывается под ссылкой «Advanced options»).
На шаге «Accounts and Roles» установщик потребует придумать пароль для доступа к БД (MySQL Root Password) — обязательно запомните или запишите этот пароль — он вам ещё понадобится.

Выполнение запросов

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

  1. Откройте командную строку (Выполнить: cmd.exe).
  2. Перейдите в каталог с установленной MySQL: cd /d /bin .
  3. Выполните: mysql -uroot -p .
  4. Введите пароль, заданный при установке.

Если вы всё выполнили верно, то в командной строке запустится клиент для работы с MySQL (вы поймете это по строке приглашения «mysql>»). С этого момента можно вводить любые SQL запросы, но каждый запрос обязательно должен заканчиваться точкой с запятой ;

Оператор SQL create database: создание новой базы данных

Приступим к практике — начнём создавать базу данных для ведения погодного дневника.
Начать следует с создания новой базы данных для нашего сайта.
Новая БД в MySQL создаётся простой командой: CREATE DATABASE

Читайте так же:
Сброс счетчика замены масла бмв

Так что, выполнив команду CREATE DATABASE weather_diary; , MySQL создаст для нас новую БД, в которой будет происходить вся дальнейшая работа.
Это важно: после создания БД её невозможно будет переименовать, а только удалить и создать заново. По этой причине крайне внимательно подойдите к выбору имени для базы данных.

Оператор create table: создание таблиц

Создав новую БД, сообщим MySQL, что теперь мы собираемся работать именно с ней.
Выбор активной БД выполняется командой: USE ;

Пришло время создать первые таблицы!
Для ведения дневника по всем правилам, понадобится создать три таблицы: города (cities), пользователи (users) и записи о погоде (weather_log).
В подразделе «Запись» этой главы описано, как должна выглядеть структура таблицы weather_log. Переведём это описание на язык SQL:

Чтобы ввести многострочную команду в командной строке используйте символ в конце каждой строки (кроме последней).

Теперь создадим таблицу городов:

MySQL может показать созданную таблицу, если попросить об этом командой: SHOW COLUMNS FROM weather_log .
В ответе будут перечислены все поля таблицы, их тип и другие характеристики.

Первичный ключ

В примере с созданием новой таблицы при перечислении необходимых полей первым полем идёт id INT AUTO_INCREMENT PRIMARY KEY .
Это поле называется первичным ключом. Обязательно создавать первичный ключ в каждой таблице.

Первичный ключ — это особенное поле, в котором сохраняется уникальный идентификатор записи. Он нужен, чтобы у программиста и базы данных всегда была возможность однозначно обратиться к одной конкретной записи для её чтения, обновления или удаления.
Если назначить поле первичным ключом, то БД будет следить за тем, чтобы значение в этом поле больше не повторялось в таблице.
А если ещё и добавить аттрибут AUTO_INCREMENT , то MySQL при добавлении новых записей будет заполнять это поле сама. AUTO_INCREMENT будет играть роль счётчика — каждая новая запись в таблице получит значение на единицу больше максимального существующего значения.

Оператор insert into: добавление записи в таблицу

Начнём с добавления новых данных в таблицу. Для добавления записи используется следующий синтаксис:

В начале добавим город в таблицу городов:

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

Теперь создадим запись о погоде за сегодняшний день.
При определении таблицы weather_log мы решили ссылаться на город, путём записи в поле city_id идентификатора города из таблицы cities. Так как мы только что добавили новый город, ничего не мешает использовать его идентификатор в записи о погоде.
Идентификатором города будет первичный ключ, который также был определён в качестве первого поля таблицы. Нумерация этого поля начинается с единицы, значит первая добавленная запись имеет идентификатор 1 . Зная это, запрос на добавление записи о погоде в Санкт-Петербурге за третье сентября 2017 года выглядит так:

Оператор select: чтение информации из БД

Для вывода информации из БД используются запросы типа SELECT .
В запросе нужно указать имя таблицы, необходимые поля, а также дополнительные параметры (будут рассмотрены в следующем уроке).

Например, чтобы получить список всех доступных городов:

Все погодные записи:

Вместо перечисления всех столбцов можно использовать знак звездочки — * .

Оператор update: обновление информации в БД

При добавлении записи очень легко совершить ошибку: сделать опечатку, не указать значение для одного из полей, и так далее.
Естественно, язык SQL предлагает возможности для редактирования уже созданных записей.

Предположим, что при добавлении погодной записи пользователь ошибся и ввёл неверную дату. Чтобы исправить эту ошибку, нужно использовать оператор обновления — UPDATE .
Запрос с этим оператором позволяет обновить значение одного или нескольких полей в существующей записи. Выглядит он так:

Но чтобы правильно составить запрос, необходимо определить условие для поиска записи, которую предлагается обновить. В противном случае, если не указать это условие, то будут обновлены абсолютно все записи в таблице.
В качестве такого условия лучше всего использовать первичный идентификатор записи. Поэтому, прежде чем выполнять запрос обновления, нужно выполнить запрос на чтение информации из таблицы, чтобы узнать, под каким идентификатором сохранилась ошибочная запись.
Допустим, этот идентификатор — единица, а правильная дата — пятое сентября 2017 года.

Запрос на обновление:

Оператор join: объединение записей из двух таблиц

В нашей таблице для хранения погодного дневника город сохраняется как идентификатор, поэтому при обычном чтении данных из этой таблицы вместо названия города стоит непонятное число. Чтобы подставить на место числа действительное значение, а конкретнее — название города, в SQL существуют операторы объединения — JOIN .
Поддержка операторов объединения и позволяет базе данных называться реляционной.

Поменяем запрос на показ погодных записей, чтобы он объединял две таблицы, а в поле города показывалось его название, а не идентификатор:

Счетчиковые машины, эквивалентность двухсчетчиковой машины МТ

Для каждого счётчика возможны четыре операции: увеличить на один, уменьшить на один, не изменять значение, проверить, является ли значение счетчика нулём.

Читайте так же:
Сопротивление для подогрева счетчика

По сути, [math]k[/math] -счётчиковая машина является [math]k[/math] -стековой машиной с односимвольным алфавитом.

Содержание

  • 1 Эквивалентность двухстековой машины трёхсчётчиковой машине
  • 2 Эквивалентность [math]k[/math] -счётчиковой машины двухсчётчиковой
  • 3 Эквивалентность двухсчётчиковой машины МТ
  • 4 См. также
  • 5 Источники информации

Эквивалентность двухстековой машины трёхсчётчиковой машине [ править ]

Для доказательства необходимо показать, что двухстековая машина имитируется на трёхсчётчиковой. Пусть [math]Pi[/math] — стековый алфавит, [math]|Pi|=P[/math] . Пронумеруем символы алфавита от [math]0[/math] до [math]P-1[/math] . Тогда стек можно рассматривать как целое число в системе счисления с основанием [math]P[/math] .

Будем использовать два счётчика для хранения состояний двух стеков, а третий счетчик будем использовать для временных вычислений. Для стека существует три типа элементарных операций: положить символ в стек, снять символ со стека, проверить верхний символ стека. Рассмотрим реализацию этих операция на трёхсчётчиковой машине.

  • Снять символ со стека. Для того, чтобы снять символ, необходимо разделить число, которым представлен стек, на [math]P[/math] , отбросив остаток.
  • Добавить символ в стек. Для того, чтобы добавить символ, необходимо умножить число, которым представлен стек, на [math]P[/math] и прибавить к нему номер символа, который добавляется на стек.
  • Проверка верхнего символа стека. Для этого необходимо найти остаток от деления на [math]P[/math] .

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

  • Разделить значение первого счётчика на число [math]C[/math] , отбросив остаток. Пока первый счётчик не равен нулю, будем уменьшать его на один. При этом после каждых [math]C[/math] успешных уменьшений значения первого счётчика будем увеличивать на один значение второго счётчика. Далее скопируем значение второго счётчика на первый: пока второй счётчик не равен нулю, уменьшаем его значение и увеличиваем значение первого счётчика. Очевидно, что при фиксированном [math]C[/math] для данной операции может быть построен управляющий автомат.
  • Умножить значение первого счётчика на число [math]C[/math] . Будем уменьшать первый счётчик на один и увеличивать второй на [math]C[/math] . Эти действия будем повторять, пока первый счётчик не равен нулю. Затем скопируем значение со второго счётчика на первый. Очевидно, что при фиксированном [math]C[/math] для данной операции может быть построен управляющий автомат.
  • Увеличить значение счётчика на [math]C[/math] . Последовательно [math]C[/math] раз увеличиваем значение счётчика на один.
  • Найти остаток от деления значения первого счётчика на число [math]C[/math] . Рассмотрим автомат из [math]C[/math] состояний. Пронумеруем состояние от [math]0[/math] до [math]C-1[/math] . Пусть [math]0[/math] — стартовое состояние автомата. Скопируем значение с первого счётчика на второй. В случае если второй счётчик не нуль, автомат осуществляет переход из состояния [math]i[/math] в состояние [math]i+1[/math] (из состояния с номером [math]C-1[/math] осуществляется переход в состояние с номером [math]0[/math] ), при этом значение второго счётчика уменьшается на один, а первого — увеличивается на один. Ясно, что в момент, когда третий счётчик станет равен нулю, управляющий автомат окажется в состоянии с номером, равным остатку от деления значения первого счётчика на [math]C[/math] .

Таким образом, мы можем имитировать работу двухстековой машины на трёхсчётчиковой.

Эквивалентность [math]k[/math] -счётчиковой машины двухсчётчиковой [ править ]

Для доказательства покажем, как имитировать [math]k[/math] -счётчиковую машины на двухсчётчиковой. Пусть [math]C_1, C_2, ldots, C_k[/math] — значения счётчиков [math]k[/math] -счётчиковой машины. Тогда состояние [math]k[/math] -счётчиковой машины можно охарактеризовать одним числом [math]2^cdot3^cdot ldots cdot p_k^[/math] , где [math]p_k[/math] — [math]k[/math] -е простое число. Тогда любое состояние k-счётчиковой машины можно хранить на одном счётчике, и использовать второй счётчик для временных вычислений.

Тогда элементарные операции на [math]k[/math] -счётчиковой машине реализуются следующим образом.

  • Увеличить [math]i[/math] -й счётчик. Для этого необходимо умножить значение счётчика на [math]p_i[/math] .
  • Уменьшить [math]i[/math] -й счётчик. Для этого необходимо поделить значение счётчика на [math]p_i[/math] .
  • Сравнить с нулём значение [math]i[/math] -го счётчика. Для этого необходимо найти остаток от деления значения счётчика на [math]p_i[/math] и сравнить его с нулём.

Операции умножения на константу, деления на константу и нахождения остатка от деления на константу значения счётчика при помощи одного вспомогательного счётчика описаны в предыдущей лемме.

Значение счетчика для добавленной записи

Делаю вставку данных в таблицу (INSERT INTO . )
В таблице есть поле id -автоматический счетчик.

Как мне узнать какое значение счетчика присвоилось только что вставленной записи?
Дело в том что во вставляемых данных нет уникального -то есть SELECT-ом именно эту запись можно и не найти.
Может есть какие другие хитрые способы? Может одним INSERT-ом можно сделать вставку данных и сразу же получить обратчно id ?

От: King Oleghttp://kingoleg.livejournal.com
Дата:17.03.05 09:44
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Как мне узнать какое значение счетчика присвоилось только что вставленной записи?

В MySQL есть спещиальный запрос для этого. Почитай документацию (last insert id)

От:Аноним
Дата:17.03.05 09:57
Оценка:

Здравствуйте, King Oleg, Вы писали:

KO>Здравствуйте, Аноним, Вы писали:

А>>Как мне узнать какое значение счетчика присвоилось только что вставленной записи?

KO>В MySQL есть спещиальный запрос для этого. Почитай документацию (last insert id)
спасибо, нашел но что-то не получается.

Читайте так же:
Кто платит за общедомой счетчик

Созставил запрос:
«INSERT INTO my_table . ; SELECT LAST_INSERT_ID();»

Если испольнить вручную через админку MySQL то всё в порядке.
Если же из PHP скрипта то получаю ошибку:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource

От: King Oleghttp://kingoleg.livejournal.com
Дата:17.03.05 10:08
Оценка:
От:Аноним
Дата:17.03.05 10:09
Оценка:

А>»INSERT INTO my_table . ; SELECT LAST_INSERT_ID();»

Сделал отдельные два запроса и исполнил их по очереди -всё работает.
Но как мне кажется это не совсем точно -между этими запросами другой клиент может успеть свою запись вставить и LAST_INSERT_ID успеет измениться.

На самом серваке эти два запроса в одном отлично отрабатывают.

проблема в PHP. хотя какая ему нах разница какую строку в базу передавать.

От:Аноним
Дата:17.03.05 10:09
Оценка:
От: Berealbereal.ru
Дата:17.03.05 10:31
Оценка:

Здравствуйте, Аноним, Вы писали:

А>>»INSERT INTO my_table . ; SELECT LAST_INSERT_ID();»

А>Сделал отдельные два запроса и исполнил их по очереди -всё работает.
А>Но как мне кажется это не совсем точно -между этими запросами другой клиент может успеть свою запись вставить и LAST_INSERT_ID успеет измениться.

А>На самом серваке эти два запроса в одном отлично отрабатывают.

А>проблема в PHP. хотя какая ему нах разница какую строку в базу передавать.

А>Разьясните пожалуйста.

В php есть специальная функция mysql_insert_id()
она выдает как раз последние вставляемые значения на отдельные коннекты к БД.

От:Аноним
Дата:17.03.05 10:37
Оценка:

B>В php есть специальная функция mysql_insert_id()
B>она выдает как раз последние вставляемые значения на отдельные коннекты к БД.

Это будет лучше(точнее) чем исполнение еще одного запроса «SELECT LAST_INSERT_ID()» ?
Или одна фигня?

От: Berealbereal.ru
Дата:17.03.05 10:41
Оценка: +1

Здравствуйте, Аноним, Вы писали:

B>>В php есть специальная функция mysql_insert_id()
B>>она выдает как раз последние вставляемые значения на отдельные коннекты к БД.

А>Это будет лучше(точнее) чем исполнение еще одного запроса «SELECT LAST_INSERT_ID()» ?
А>Или одна фигня?

Мне кажется если писать на php то использование данной функции правильнее.

А по действию — сейчас подумал — мне кажется она как раз выполняет запрос «SELECT LAST_INSERT_ID()»

От: King Oleghttp://kingoleg.livejournal.com
Дата:17.03.05 10:53
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Но как мне кажется это не совсем точно -между этими запросами другой клиент может успеть свою запись вставить и LAST_INSERT_ID успеет измениться.

Не изменится. LAST_INSERT_ID привязан к сессии (конкретному подключению к БД).

От:Аноним
Дата:17.03.05 10:54
Оценка:

Здравствуйте, King Oleg, Вы писали:

KO>Здравствуйте, Аноним, Вы писали:

А>>Но как мне кажется это не совсем точно -между этими запросами другой клиент может успеть свою запись вставить и LAST_INSERT_ID успеет измениться.

KO>Не изменится. LAST_INSERT_ID привязан к сессии (конкретному подключению к БД).

От: deadem
Дата:17.03.05 12:26
Оценка:

А>Делаю вставку данных в таблицу (INSERT INTO . )
А>В таблице есть поле id -автоматический счетчик.
А>Как мне узнать какое значение счетчика присвоилось только что вставленной записи?

От: FreeBeer
Дата:17.03.05 12:49
Оценка:

Здравствуйте, King Oleg, Вы писали:

KO>Не изменится. LAST_INSERT_ID привязан к сессии (конкретному подключению к БД).

А что будет, если для подключения используется вызов pconnect и инсерты идут с нескольких сторон?

От: Berealbereal.ru
Дата:17.03.05 12:55
Оценка:

Здравствуйте, FreeBeer, Вы писали:

FB>Здравствуйте, King Oleg, Вы писали:

KO>>Не изменится. LAST_INSERT_ID привязан к сессии (конкретному подключению к БД).

FB>А что будет, если для подключения используется вызов pconnect и инсерты идут с нескольких сторон?

Тогда всё может сломаться.

Для стабильности лучше такую схему не использовать.

То есть или для каждого соединения с инсертом заводить свой коннект или . перестать хотеть узнавать insert_id()

Хотя есть еще вариант но «через одно место».
завести в таблице какое нибудь свободное поле, и вместе с новой записью ложить туда заведомо уникальное (или близко к этому) значение, запоминая его при этом. а потом спрашивать вставленное ID по нему. но это конечно из области изврата

От: FreeBeer
Дата:17.03.05 13:17
Оценка:

Здравствуйте, Bereal, Вы писали:

FB>>А что будет, если для подключения используется вызов pconnect и инсерты идут с нескольких сторон?

B>Тогда всё может сломаться.

B>Для стабильности лучше такую схему не использовать.

B>То есть или для каждого соединения с инсертом заводить свой коннект или . перестать хотеть узнавать insert_id()
Печально сие есть, хотя я так и думал..

B>Хотя есть еще вариант но «через одно место».
B>завести в таблице какое нибудь свободное поле, и вместе с новой записью ложить туда заведомо уникальное (или близко к этому) значение, запоминая его при этом. а потом спрашивать вставленное ID по нему. но это конечно из области изврата

Почему изврат — метод использования GUID-ов. причем Гуиды можно генерить и распределять в той-же базе(т.е. из одного места :))

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector