Key violation как исправить

 
KIR
 
(2002-07-25 13:48)
[0]

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


 
kaif
 
(2002-07-25 13:52)
[1]

А можно подробнее? Как выражается то, что

>после этого невозможно вносить записи в таблицу


 
Anatoly Podgoretsky
 
(2002-07-25 13:53)
[2]

Поле уникальное ли какие другие ограничения


 
KIR
 
(2002-07-25 14:01)
[3]

Все происходит следующим образом: приложение работает совершенно нормально, т.е. вносит-изменяет-удаляет записи в таблицах БД. Потом без всяких видимых причин при добавлении очередной (кстати 601 по счету) записи выдается сообщение «Key Violation». И все…


 
kaif
 
(2002-07-25 14:03)
[4]

Дело в том, что в BDE есть ошибка.

1.Если нарушить уникальность.

2.Затем сделать SQL-запрс.

3.Затем еще раз нарушить уникальность.

То у Paradox таблицы разрушается индекс (index out of date).

Эта ошибка есть в D3,D4,D5,D6.

Я поэтому с Paradox не работаю.


 
kaif
 
(2002-07-25 14:06)
[5]

В принципе, после key violation ничего особого происходить не должно.

Что значит «и все» ?

Программа виснет, база потом не откывается (если да, то что при этом сообщается) и т.д…?

Ну нельзя так абстрактно вопросы задавать!


 
Lord Warlock
 
(2002-07-25 14:07)
[6]



> kaif © (25.07.02 14:03)

Надо не нарушать уникальность



> KIR © (25.07.02 14:01)

Переиндексируй таблицу


 
kaif
 
(2002-07-25 14:23)
[7]

>Lord Warlock © (25.07.02 14:07)

>> kaif © (25.07.02 14:03)

>Надо не нарушать уникальность

Как это???


 
Lord Warlock
 
(2002-07-25 14:29)
[8]



> kaif © (25.07.02 14:23)

Программа не должна нарушать уникальность и целостность БД. Ошибки могут возникать если например отрубили свет. В таком случае надо автоматом запускать переиндексацию, тогда всем будет хорошо.


 
Lusha
 
(2002-07-25 14:34)
[9]

>Lord Warlock © (25.07.02 14:29)

Не всегда… Иногда не успевает прописаться новое значение автоинкрементного ключа в заголовок таблицы… Тогда даже при рабочих индексах имеем Key violation при добавлении записи…


 
Anatoly Podgoretsky
 
(2002-07-25 14:42)
[10]

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

Парадокс на то Парадокс.

Главный парадокс что он как то еще и работает иногда.

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

Ну нельзя так абстрактно вопросы задавать!


 
kaif
 
(2002-07-25 15:02)
[11]

> Lord Warlock © (25.07.02 14:29)

> kaif © (25.07.02 14:23)

> Программа не должна нарушать уникальность и целостность БД

Ключи на то исуществуют, чтобы не нарушать целостность. Key Violation — сообщение о попытке такого нарушения. Что-то я в толк не возьму, что Вы имеете в виду. Чтобы я сказал юзеру «Не нарушай уникальность, а то key violation будет»? Paradox защищает целостность с помощью этой исключительной ситуации. А то, что 2 попытки нарушить key и запрос между ними разрушают базу — это баг, который логически обойти невозможно в принципе, не отказавшись от использования Local SQL в Paradox.


 
Lord Warlock
 
(2002-07-25 15:06)
[12]



> Lusha © (25.07.02 14:34)

Надо делать свой механизм автоинкрементного ключа



> kaif © (25.07.02 15:02)

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


 
kaif
 
(2002-07-25 15:21)
[13]

>2 Lord Warlock © (25.07.02 15:06)

А я и не говорю про автоинкремент.

По-вашему, в Paradox таблице вообще не нужны никакие уникальные индексы? Пускай все приложение делает? А если много юзеров, а если уникальность, это номер, например, введенного счета-фактуры?

И вообще я работаю с клиент-серверными базами. Там нарушение ключа — всегда дело сервера, а не приложения. Иначе вообще не нужны были бы все эти индексы…

Боюсь, что Вы зря настаиваете на своем подходе. Я говорил о баге, который есть в BDE и который в упор никто не хочит исправить. А в результате только и слышишь: «Парадокс — ненадежная база». А баг очень простой и мало заметный. И его нужно исправить, а не обходить. Без него Paradox — прекрасная СУБД.


 
KIR
 
(2002-07-26 11:21)
[14]

Народ, извините, что не дал все подробности, о которых вы просите. Я просто не ожидал такой бурной дискусси на данную тему. Но, честно говоря разъяснять-то особо и нечего. BDE выдает сообщение «Key Violation» и отказывается добавлять запись в таблицу. Вот принципе и все. Вот еще, кстати, при использовании DataBase DeskTop»a после данной ситуации как-то странно себя вело значение в автоинкрементном поле, т.е. обычно, когда вы добавляете запись (просто нажимаете стрелку «вниз» находясь на последней строчке таблицы в DataBase DeskTop»e), то в автоикрементном поле очередной записи сразу добавляется очередное значение — в моем случае такого не случалось.

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


 
kaif
 
(2002-07-26 12:06)
[15]

Переиндексировать — это удалить имеющийся индексный файл и вместо него создать новый.

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

Для переиндексации компонент TTable имеет свойство IndexDefs, имеющее соответствующие методы. Почитай Help. Там, кажется, были примеры того, как создать индекс заново.


 
Weare
 
(2002-07-26 12:07)
[16]

Например, в твоем же desktop»e открыть таблицу и поставить внизу галочку Pack Table, или просто пересоздать индексы.А можно и програмно:

Table.Exclusive:=True;

Table.Open;

Check(dbiRegenIndexes(Table.Handle));


 
KIR
 
(2002-07-26 12:41)
[17]

Еще вопрос — у меня в БД достаточно много перексрестных ссылок (насколько я понимаю, это то же самое что и внешний ключ). Так вот из-за этого к некоторым таблицам невозможно добавлять поля. Paradox пишет, что «detail table exists». В DBDeskTop»e убираю все Referential Integrity — пишет то же самое. В итоге я вообще отказался от применения внешних ключей в БД. Т.е. не совсем отказался. Я просто не устанавливаю связи через Referential Integrity в DBDeskTop»e. Правильно я делаю?


 
Mike Kouzmine
 
(2002-07-26 12:43)
[18]

Конечно правильно.


1 / 1 / 0

Регистрация: 25.12.2010

Сообщений: 25

1

27.12.2011, 17:46. Показов 22938. Ответов 4


Студворк — интернет-сервис помощи студентам

Подскажите, пожалуйста, кто знает. В БД при добавлении записи появляется ошибка Key Violation. Не могу установить причину её появления, ну и соответственно исправить.Причём самое интересное то, что первоначально всё работало нормально, а потом появилась эта ошибка. Я восстанавливал базу из архивной копии — ошибка пропадала, но потом опять появлялась. Использую BDE, таблицы Paradox. Заранее спасибо



0



1 / 1 / 0

Регистрация: 25.12.2010

Сообщений: 25

27.12.2011, 22:05

 [ТС]

2

PS: Есть такое предположение.База работает в сети.Скорее всего ошибка возникла из-за того, что таблицы в BDE автоматически не обновляются.Т.е. запись добавленная в одну и ту же таблицу на разных компах,наверное,имеет один ID (ID — первичный индекс,автоинкремент).Самое интересное то, что у меня на одном компе такая ошибка тоже была…



0



1 / 1 / 7

Регистрация: 28.06.2011

Сообщений: 342

28.12.2011, 10:07

3

Key violation — нарушение ключа.. Ты в поле(я), входяще в ПК (первичный ключ) пытаешься ввести одиноковое(ые) значение(я)..Если поле типа AutoInc, то вполне реально могла порушиться таблица и генерируется одно и тоже значение.. Самы просто йвариант — создать аналогичную таблицу где-то еще и перетянуть туда данные.. Хотя тут может быть проблем, если ID где-то используется как мастре-ключ…



0



1 / 1 / 0

Регистрация: 25.12.2010

Сообщений: 25

28.12.2011, 12:17

 [ТС]

4

А из-за чего может рухнуть таблица? Дело в том, что БД работает далеко от меня и люди, которые с ней работают ничего с ней не смогут сделать.Не могу же я каждый раз выезжать к ним или брать у них эти таблицы, чтобы их исправить.



0



1 / 1 / 7

Регистрация: 28.06.2011

Сообщений: 342

28.12.2011, 13:22

5

А из-за чего самолеты падают ? В настройках BDE-Local Share=True — ОБЯЗАТЕЛЬНО ! А рухнуть… Лепистричество вырубилось, комп повис в момент записи (значение счетчика в заголовке таблицы где-то лежит).. Да мало ли что…



0



Demidova Aigul

Гость


Люди добрые, помогите новичку, пожалуйста! У меня ошибка в Делфи, связанная с SQL Server(ом): «Key violation. General SQL error. [Microsoft] [ODBS SQL Server Driver]. Connection is busy with results for another hstmt. BDE error 9729.   [$26]  [$1]»
Как это исправить?
Эта ошибка у меня возникает, когда в Делфи в датамодуле в одном из Query в редакторе полей (так он кажется называется) делаю Select all—>Delete—->Add all fields. И вот когда Add all fields — тогда выходит выше указанная ошибка.  Быть такого не может


Записан
Oldy

Команда клуба

ru
Offline Offline
Пол: Мужской


Не помню инструкции «ADD» в SQL.
Есть:
 SELECT…
 INSERT…
 DELETE…
 UPDATE…


Записан

С уважением, Oldy.

Dimka

Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской


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


Записан

Программировать — значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)

Dimyan

Гость


понимаю так что ты просто пытаешся добавить поля в Fields Editor
ругается у тебя потомучто судя по ошибке проблемы с подключением к БД и он запрос не может выполнить чтоб проверить его правильность и возможность добавления полей в Fields Editor
Если запрос точно верный, проверяй соединение с базой (компонент DataBase)
А вообще для соединения с MS SQL Server лучше использовать ADO и подключатся соответственно через OLE DB всетки эта родная связка M$


Записан
Demidova Aigul

Гость


Спасибо всем за советы. В общем, с этой ошибкой разобралась. Таблицы и связи немного подредактировала и вроде все прошло.  Отлично  Но зато какая другая ошибка!  Быть такого не может.  Открою новую тему в теме «Делфи». Может, если есть время, посмотрите?

« Последнее редактирование: 05-05-2005 10:13 от Demidova Aigul »
Записан

>
Key violation или детские грабли
, Paradox/BDE

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
22.11.05, 07:23

    Full Member

    ***

    Рейтинг (т): 11

    Привет всем! :)
    Delphi 7/Paradox/BDE
    Ситуация выглядит так: имеются несколько отдельных таблиц *.db В каждой из них имеется одно ключевое поле (типа autoincrement). И несколько обычных (целочисленные и строковые). Внешних ключей нет (соответственно таблицы между собой не связаны, каждая сама по себе). Работаю с таблицами через компоненту TQuery. Точнее у меня на каждую таблицу используется своя Query (так надо было: чтобы одновременно можно было наборы данных из разных таблиц в разных DBGrid смотреть, а через Query проще делать выборку по условиям). Запись новых строк делаю тоже через Query, но в следующей последовательности: создаю новый Query, выполняю insert для нужно таблицы, освобождаю Query. После, для связанного с таблицей Query делаю Close/Open.
    Кроме того, чтобы при запущенной проге никто извне не мог читать данные, стоят дополнительно компоненты Table с Exclusive=true.
    Эта программа стоит у достаточного количества пользователей. У некоторых из них через разное время перестали добавляться новые записи. Выдается ошибка «Key Violation». Читать данные можно, делать update тоже, а вот добавлять новые — нет. :wall: Дублирование записей исключено (у меня автоинкрементное поле стоит), переполнение тоже быть не может. :wall: Может кто знает из-за чего такая штука возможна? Заранее спасибо.

    —-
    ЗЫ: больней чем наступить на грабли, может быть только наступить на детские грабли! :wacko:


    Coala



    Сообщ.
    #2

    ,
    22.11.05, 08:16

      :wall: , но я бы не стал вводить для добавления рантаймовый TQuery. C BDE давно не работал, но там для запросов на изменение данных
      надо с каждым TQuery иметь TUpdateSQL с соответствующими настройками. Возможно, глючит здесь.

      Цитата SilverShield @ 22.11.05, 07:23

      стоят дополнительно компоненты Table с Exclusive=true

      не совсем понятно…
      ЗЫ. А нет возможности перейти на ADO?


      .DeV!L



      Сообщ.
      #3

      ,
      22.11.05, 08:19

        Full Member

        ***

        Рейтинг (т): 11

        Цитата SilverShield @ 22.11.05, 07:23

        Работаю с таблицами через компоненту TQuery. Точнее у меня на каждую таблицу используется своя Query (так надо было: чтобы одновременно можно было наборы данных из разных таблиц в разных DBGrid смотреть, а через Query проще делать выборку по условиям). Запись новых строк делаю тоже через Query, но в следующей последовательности: создаю новый Query, выполняю insert для нужно таблицы, освобождаю Query. После, для связанного с таблицей Query делаю Close/Open.
        Кроме того, чтобы при запущенной проге никто извне не мог читать данные, стоят дополнительно компоненты Table с Exclusive=true.

        :wacko: :wacko: :blink: афтар выпей йаду!!!!

        если ею пользуются много народу, то BDE отпдает автоматически, так как это не клиент серверная БД!!!

        тебе нада InterBase или что-то похожее….

        а твой проект это не детские грабли….это МЕГА ГРАБЛИ!!!! :ph34r:

        Сообщение отредактировано: .DeV!L — 22.11.05, 08:21


        SilverShield



        Сообщ.
        #4

        ,
        22.11.05, 08:29

          Full Member

          ***

          Рейтинг (т): 11

          Запись новых строк производится не в самой проге, а вынесена в dll, потому и производится динамически. Через ADO, на сколько я знаю, Парадокс извратно использовать.
          .DeV!L, все с тобой ясно. Действительно награмождение, но все-таки, есть мысли по делу? Хотяб в каком направлении копать?

          Добавлено 22.11.05, 08:35
          .DeV!L, это локальная база, с ней надо работать только одному пользователю, так что с архитектурой все нормально. А про мега-грабли, читай ЗЫ :)


          Coala



          Сообщ.
          #5

          ,
          22.11.05, 08:38

            Цитата SilverShield @ 22.11.05, 08:29

            Запись новых строк производится не в самой проге, а вынесена в dll, потому и производится динамически.

            А кто тебе мешает в длл-ке иметь квери и апдейт-скл, созданные в дизайне?


            SilverShield



            Сообщ.
            #6

            ,
            22.11.05, 09:03

              Full Member

              ***

              Рейтинг (т): 11

              Coala, согласен, можно и в дизайне. Попробую поставить TUpdateSQL, он вроде кэшировать запросы позволяет?


              Coala



              Сообщ.
              #7

              ,
              22.11.05, 09:12

                Цитата SilverShield @ 22.11.05, 08:29

                Через ADO, на сколько я знаю, Парадокс извратно использовать.

                Первый раз слышу :(

                Цитата SilverShield @ 22.11.05, 09:03

                Попробую поставить TUpdateSQL, он вроде кэшировать запросы позволяет?

                Деталей не помню, но без него ты просто не создашь запрос на модификацию данных (в отличие от ADO).


                SilverShield



                Сообщ.
                #8

                ,
                22.11.05, 09:19

                  Full Member

                  ***

                  Рейтинг (т): 11

                  Цитата Coala @ 22.11.05, 09:12

                  Деталей не помню, но без него ты просто не создашь запрос на модификацию данных (в отличие от ADO).

                  ExpandedWrap disabled

                    update Table1 set Col2 = … where Col1 = …

                  Все отлично работает и без TUpdateSQL :)

                  ExpandedWrap disabled

                    TUpdateSQL applies cached updates on behalf of queries or stored procedures that can’t post updates directly.

                  Взято из хелпа к нему.

                  Сообщение отредактировано: SilverShield — 22.11.05, 09:20

                  Wizard

                  Bas



                  Сообщ.
                  #9

                  ,
                  22.11.05, 09:58

                    А сколько записей в таблицах (чему равен максимальный id)?


                    SilverShield



                    Сообщ.
                    #10

                    ,
                    22.11.05, 10:08

                      Full Member

                      ***

                      Рейтинг (т): 11

                      Не больше 6000. Поэтому вариант с переполнением я и исключил.
                      Кстати, таким образом загнулось сразу несколько таблиц! Связей через ключи между этими таблицами нет. :wall: Главное причину понять, тогда я ее как-нить уже поборю.


                      H.Iglesias II



                      Сообщ.
                      #11

                      ,
                      22.11.05, 10:16

                        Цитата

                        Главное причину понять, тогда я ее как-нить уже поборю.

                        попробуй удалить и создать заново их индексы


                        Coala



                        Сообщ.
                        #12

                        ,
                        22.11.05, 10:21

                          Цитата SilverShield @ 22.11.05, 07:23

                          Выдается ошибка «Key Violation».

                          Полный текст сообщения можешь привести?


                          SilverShield



                          Сообщ.
                          #13

                          ,
                          22.11.05, 10:36

                            Full Member

                            ***

                            Рейтинг (т): 11

                            Сообщение ошибки выглядит примерно так:

                            ExpandedWrap disabled

                              «Project PTest1.exe raised exception class EDBEngineError with message ‘Key violation’. Process stopped. … «

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

                            Добавлено 22.11.05, 10:38
                            H.Iglesias II, подскажи если не трудно, через что пересоздание индексов делается? Мне это впервой, я обычно с MSSQL работаю :)

                            Wizard

                            Bas



                            Сообщ.
                            #14

                            ,
                            22.11.05, 10:41

                              Цитата SilverShield @ 22.11.05, 10:36

                              через что пересоздание индексов делается?

                              ExpandedWrap disabled

                                DROP INDEX table_reference.index_reference | PRIMARY

                                CREATE [UNIQUE] [ASC | DESC] INDEX index_reference ON table_reference (column_reference [,column_reference…])


                              SilverShield



                              Сообщ.
                              #15

                              ,
                              22.11.05, 11:17

                                Full Member

                                ***

                                Рейтинг (т): 11

                                Спасибо. Только дело в том что я из индексов использовал только первичный ключ (поставил на автоинкрементное поле). В хелпе Database Desktop нашел такую фразу: первичный индекс в Paradox может быть создан только через определение первичного ключа при создании таблицы. Получается единственное решение — это грохать таблицу и создавать ее заново?
                                Если проблема в падении индексов, то все равно не понятно почему они упали сразу на нескольких таблицах с разной структурой и разным количеством строк!

                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                0 пользователей:

                                • Предыдущая тема
                                • Delphi: Базы данных
                                • Следующая тема

                                [ Script execution time: 0,0428 ]   [ 16 queries used ]   [ Generated: 25.05.23, 20:50 GMT ]  

                                Создание таблиц с помощью SQL 

                                Если Вы хотите воспользоваться компонентом TQuery, сначала поместите его на форму. После этого настройте свойство DatabaseName на нужный Вам алиас (если базы данных еще не существует, удобней создать ее в WISQL командой File|Create Database…, а затем уже настроить на нее новый алиас). После этого можно ввести SQL-предложение в свойство SQL. Для выполнения запроса, изменяющего структуру, вставляющего или обновляющего данные на сервере, нужно вызвать метод ExecSQL компонента TQuery. Для выполнения запроса, получающего данные с сервера (т.е. запроса, в котором основным является оператор SELECT), нужно вызвать метод Open компонента TQuery. Ёто связано с тем, что BDE при посылке запроса типа SELECT открывает так называемый курсор, с помощью которого осуществляется навигация по выборке данных (подробней об этом см. в уроке, посвященном TQuery). 

                                Как показывает опыт, проще воспользоваться утилитой WISQL. Для этого в WISQL выберите команду File|Run an ISQL Script… и выберите файл, в котором записан ваш скрипт, создающий базу данных. После нажатия кнопки УOKФ ваш скрипт будет выполнен, и в нижнее окно будет выведен протокол его работы. 

                                Приведем упрощенный синтаксис SQL-предложения для создания таблицы на SQL-сервере InterBase (более полный синтаксис можно посмотреть в online-справочнике по SQL, поставляемом с локальным InterBase): 

                                CREATE TABLE table
                                ( [,  |  …]);

                                где 

                                table — имя создаваемой таблицы, 
                                — описание поля, 
                                — описание ограничений и/или ключей (квадратные скобки [] означают необязательность, вертикальная черта | означает УилиФ). 

                                Описание поля состоит из наименования поля и типа поля (или домена — см. урок 9), а также дополнительных ограничений, накладываемых на поле: 

                                 = col {datatype | COMPUTED BY () | domain}
                                [DEFAULT {literal | NULL | USER}]
                                [NOT NULL] []
                                [COLLATE collation]

                                Здесь: 

                                col — имя поля; 
                                datatype — любой правильный тип SQL-сервера (для InterBase такими типами являются — см. урок 11 — SMALLINT, INTEGER, FLOAT, DOUBLE PRECISION, DECIMAL, NUMERIC, DATE, CHAR, VARCHAR, NCHAR, BLOB), символьные типы могут иметь CHARACTER SET — набор символов, определяющий язык страны. Для русского языка следует задать набор символов WIN1251; 
                                COMPUTED BY () — определение вычисляемого на уровне сервера поля, где — правильное SQL-выражение, возвращающее единственное значение; 
                                domain — имя домена (обобщенного типа), определенного в базе данных; 
                                DEFAULT — конструкция, определяющая значение поля по умолчанию; 
                                NOT NULL — конструкция, указывающая на то, что поле не может быть пустым; 
                                COLLATE — предложение, определяющее порядок сортировки для выбранного набора символов (для поля типа BLOB не применяется). Русский набор символов WIN1251 имеет 2 порядка сортировки — WIN1251 и PXW_CYRL. Для правильной сортировки, включающей большие буквы, следует выбрать порядок PXW_CYRL. 
                                Описание ограничений и/или ключей включает в себя предложения CONSTRAINT или предложения, описывающие уникальные поля, первичные, внешние ключи, а также ограничения CHECK (такие конструкции могут определяться как на уровне поля, так и на уровне таблицы в целом, если они затрагивают несколько полей): 

                                 = [CONSTRAINT constraint ] 

                                [an error occurred while processing this directive] 

                                Здесь 

                                 = {{PRIMARY KEY | UNIQUE} (col[,col…]) | 
                                FOREIGN KEY (col [, col …]) REFERENCES other_table 
                                | CHECK ()}

                                 = 
                                {  { | ()} 
                                |  [NOT] BETWEEN  AND  
                                |  [NOT] LIKE  [ESCAPE ] 
                                |  [NOT] IN ( [,  …] | 

                                 = {
                                col [] |  |  | 
                                | NULL | USER | RDB$DB_KEY } [COLLATE collation]

                                  = num | «string» | charsetname «string»
                                 = {
                                COUNT (* | [ALL]  | DISTINCT )
                                | SUM ([ALL]  | DISTINCT )
                                | AVG ([ALL]  | DISTINCT )
                                | MAX ([ALL]  | DISTINCT )
                                | MIN ([ALL]  | DISTINCT )
                                | CAST ( AS <datatype>)
                                | UPPER ()
                                | GEN_ID (generator, )
                                }

                                 = {= | < | > | <= | >= | !< | !> | <> | !=}

                                 = выражение SELECT по одному полю, 
                                которое возвращает в точности одно значение.

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

                                Пример A: Простая таблица с конструкцией PRIMARY KEY на уровне поля 

                                CREATE TABLE REGION (
                                REGION REGION_NAME NOT NULL PRIMARY KEY,
                                POPULATION INTEGER NOT NULL);

                                Предполагается, что в базе данных определен домен REGION_NAME, например, следующим образом: 

                                 CREATE DOMAIN REGION_NAME 
                                AS VARCHAR(40) CHARACTER SET WIN1251 COLLATE PXW_CYRL;

                                Пример B: Таблица с предложением UNIQUE как на уровне поля, так и на уровне таблицы 

                                CREATE TABLE GOODS (
                                MODEL SMALLINT NOT NULL UNIQUE,
                                NAME CHAR(10) NOT NULL, 
                                ITEMID INTEGER NOT NULL, CONSTRAINT MOD_UNIQUE 
                                UNIQUE (NAME, ITEMID));

                                Пример C: Таблица с определением первичного ключа, внешнего ключа и конструкции CHECK, а также символьных массивов 

                                CREATE TABLE JOB (
                                JOB_CODE JOBCODE NOT NULL,
                                JOB_GRADE JOBGRADE NOT NULL,
                                JOB_REGION REGION_NAME NOT NULL,
                                JOB_TITLE VARCHAR(25) CHARACTER SET WIN1251 COLLATE PXW_CYRL NOT NULL,
                                MIN_SALARY SALARY NOT NULL,
                                MAX_SALARY SALARY NOT NULL,
                                JOB_REQ BLOB(400,1) CHARACTER SET WIN1251,
                                LANGUAGE_REQ VARCHAR(15) [5],
                                PRIMARY KEY (JOB_CODE, JOB_GRADE, JOB_REGION),
                                FOREIGN KEY (JOB_REGION) REFERENCES REGION (REGION),
                                CHECK (MIN_SALARY < MAX_SALARY));

                                Данный пример создает таблицу, содержащую информацию о работах (профессиях). Типы полей основаны на доменах JOBCODE, JOBGRADE, REGION_NAME и SALARY. Определен массив LANGUAGE_REQ, состоящий из 5 элементов типа VARCHAR(15). Кроме того, введено поле JOB_REQ, имеющее тип BLOB с подтипом 1 (текстовый блоб) и размером сегмента 400. Для таблицы определен первичный ключ, состоящий из трех полей JOB_CODE, JOB_GRADE и JOB_REGION. Далее, определен внешний ключ (JOB_REGION), ссылающийся на поле REGION таблицы REGION. И, наконец, включено предложение CHECK, позволяющее производить проверку соотношения для двух полей и вызывать исключительное состояние при нарушении такого соотношения. Пример D: Таблица с вычисляемым полем 

                                CREATE TABLE SALARY_HISTORY (
                                EMP_NO EMPNO NOT NULL,
                                CHANGE_DATE DATE DEFAULT «NOW» NOT NULL,
                                UPDATER_ID VARCHAR(20) NOT NULL,
                                OLD_SALARY SALARY NOT NULL,
                                PERC_CHANGE DOUBLE PRECISION DEFAULT 0 NOT NULL
                                CHECK (PERC_CHANGE BETWEEN -50 AND 50),
                                NEW_SALARY COMPUTED BY
                                (OLD_SALARY + OLD_SALARY * PERC_CHANGE / 100),
                                PRIMARY KEY (EMP_NO, CHANGE_DATE, UPDATER_ID),
                                FOREIGN KEY (EMP_NO) REFERENCES EMPLOYEE (EMP_NO));

                                Понравилась статья? Поделить с друзьями:
                              • Как составить завещание перед смертью
                              • Как найти величину угла 7 класс геометрия
                              • Как найти похожую фотку на свою
                              • Как найти коэффициент износа оборудования
                              • Как найти площадь треугольника расположенного в прямоугольнике