Создание и изменение таблиц в Microsoft Visual FoxPro
« Назад Команда CREATE [FileName | ?]открывает проектировщик таблицы VFP для ее создания. Параметр (см. также табл. 1.6): FileName – имя или полное имя создаваемой таблицы. Расширение может быть опущено. Если таблица создается, когда имеется текущая база данных, то таблица будет добавлена в эту базу данных. Имя таблицы не должно содержать дефиса. Имена устройств MS-DOS, такие, как CON, NUL, PRN и COM1, не должны использоваться в качестве имени таблицы. Команда CREATE TABLE – SQL CREATE TABLE | DBF TableName1 [NAME LongTableName] создает таблицу по списку полей или из массива ArrayName. Если таблица создается, когда имеется текущая база данных, и опущена опция FREE, то таблица будет добавлена в эту базу данных. Опции и параметры: CREATE TABLE | DBF TableName1 – создает таблицу с именем DBF-файла TableName1. Опции TABLE и DBF равнозначны. Имя таблицы может включать путь к DBF-файлу. Расширение DBF в имени файла может быть опущено. Если путь не указан, то таблица создается в директории по умолчанию. Имя TableName1 без пути и расширения называется коротким именем таблицы базы данных. nCodePage – номер используемой кодовой страницы; список кодовых страниц приведен в разд. 3.7.6. NAME LongTableName – длинное имя таблицы. Оно может быть задано, только когда открыта база данных (таблица создается как часть базы данных), поскольку именно в ней хранятся длинные имена. Длинное имя может содержать до 128 символов (буквы, цифры, знаки подчеркивания) и употребляться взамен короткого имени таблицы. Длинное имя не должно совпадать с длинными именами других таблиц. Если опция NAME опущена, то длинное и короткое имена таблицы совпадают. VFP отображает длинное имя, если оно задано, всякий раз, когда таблица появляется в интерфейсе, например в Project Manager, Database Designer, Query Designer, View Designer или в заголовке Browse-окна. Длинное имя употребляется в других оперирующих с таблицами баз данных командах и функциях, например в команде RENAME TABLE и функции DBGETPROP( ). Пример: create table d:\VendIntl name VendorsInternational (Company C(40)) Замечание. Параметр LongTableName, как, впрочем, и имя поля, может быть указано в виде символьной строки, например: create table d:\VendIntl name "VendorsInternational" ("Company" C(40)) FREE – указывает, что таблица не включается в открытую базу данных (создается свободная таблица). Если база данных не открыта, использование FREE необязательно. Если опция FREE задана, а файл с именем TableName1 уже существует, то поведение приложения зависит от установки SET SAFETY. FieldName1, FieldType, nFieldWidth, nPrecision – имя поля, тип поля, длина поля и точность. Число полей в таблице не должно быть более 255 или 254, если хотя бы одно поле таблицы поддерживает NULL. Параметр FieldType – это короткое или длинное имя типа данных поля. С полями некоторых типов должны задаваться параметры nFieldWidth и nPrecision (вместе или порознь). Всевозможные варианты задания параметров описаны в табл. 15.2. Таблица 15.2 Варианты задания параметров FieldType, nFieldWidth и nPrecision
Параметры nFieldWidth и nPrecision игнорируются для W, D, T, I, Y, L, M и G типов данных. Если параметр nPrecision не включен для полей типа N и F, то он считается равным нулю. Если параметр nPrecision не включен для поля типа B, то он принимается равным установке команды SET DECIMALS. NULL | NOT NULL – указывает, допустим ли NULL для поля или нет. Если опция NULL | NOT NULL опущена, то берутся установки команды SET NULL, но не всегда: если включена опция PRIMARY KEY или UNIQUE, то независимо от установки SET NULL берется NOT NULL. В то же время VFP не генерирует сообщения об ошибке, если создается первичный или кандидатный индекс и одновременно разрешается NULL, несмотря на то, что NULL не допустим в полях, используемых для индексов такого рода. Сообщение об ошибке, однако, возникнет при работе программы, если будет выполнена попытка установить в это поле NULL. Если действует опция NOT NULL, запрещающая ввод NULL, то при попытке ввести в поле NULL генерируется ошибка. CHECK lExpression1 – правило проверки поля. Выражение lExpression1 является логическим и может быть пользовательской или хранимой процедурой. Проверка завершается с положительным результатом, если lExpression1 вычисляется со значением .T. VFP вычисляет lExpression1 и в том случае, когда добавляется чистая запись. Опция CHECK может быть употреблена только для таблицы, включаемой в базу данных. ERROR cMessageText1 – сообщение об ошибке. VFP генерирует это сообщение, когда lExpression1 вычисляется со значением .F.; если опция ERROR опущена, то генерируется системное сообщение об ошибке. Сообщение об ошибке генерируется VFP, в том числе и когда данные изменяются в Edit (Change) или Browse-окне. Пример. При добавлении чистой записи нарушается правило TypeId > 0, заданное командой CREATE TABLE для поля TypeId таблицы WorkT. && Должна быть открыта и выбрана база данных. && В противном случае употреблении опции CHECK недопустимо if not Dbused('Homelibrary') then open database d:\Homelibrary\Homelibrary else set database to Homelibrary endif && Таблица WorkT не должна быть частью базы данных if Indbc('WorkT', 'TABLE') then MessageBox('Таблица WorkT уже имеется в базе данных!') return endif create table d:\WorkT.dbf ; (TypeId Int check TypeId > 0 ; error "Значение поля TypeId должно быть положительно", ; WorkType Char(20)) && Добавляем чистую запись && Возникающее при этом сообщение об ошибке приведено на рис. 15.1 append blank Рис. 15.1. При выполнении команды APPEND BLANK нарушено правило TypeId > 0 AUTOINC [NEXTVALUE NextValue [STEP StepValue]] – устанавливает автоматическое увеличение значения поля типа Integer на величину шага StepValue: значение поля вновь добавленной записи будет равно значению поля предшествующей записи + StepValue. Для поля первой записи берется значение NextValue, которое может быть целым числом в диапазоне от –2,147,483,647 до 2,147,483,647; значение по умолчанию – число 1. Параметр StepValue по умолчанию также равен 1 и может изменяться в диапазоне от 1 до 255. Опция STEP не может быть задана без опции NEXTVALUE. Попытка задать опцию AUTOINC полю, тип которого отличен от Integer, приведет к генерации ошибки. Замечание. Поле, имеющее тип Integer (AutoInc), доступно только для чтения. Следующее значение поля может быть задано в поле Next Value вкладки Fields проектировщика таблиц. Там же в поле Step устанавливается и шаг приращения значения. Программно эти величины регулируются SQL-командой ALTER TABLE. Пример: close databases open database d:\HomeLibrary\HomeLibrary.dbc create table d:\WorkT.dbf (TypeId I autoInc nextValue 1 step 2, WorkType C(20)) for k = 1 to 5 insert into WorkT (WorkType) values ('Type' + Transform(k)) next browse last && Результат см. на рис. 15.2 Рис. 15.2. Пять записей таблицы WorkT с полем Integer (AutoInc) DEFAULT eExpression1 – значение поля по умолчанию, используемое при добавлении записи. Тип выражения eExpression1 должен совпадать с типом поля. Опция DEFAULT может быть задана только для таблицы базы данных. Если употреблена опция AUTOINC, то значение по умолчанию не используется. PRIMARY KEY | UNIQUE – создает первичный (опция PRIMARY KEY) или кандидатный (опция UNIQUE) ключ, использующий в качестве выражения FieldName1 и имеющий то же имя. COLLATE cCollateSequence – задает collate-последовательность. По умолчанию для cCollateSequence используется MACHINE. Опция может быть использована, если указана опция PRIMARY KEY | UNIQUE. Пример. Создается таблица WorkT, имеющая 2 поля, кандидатный ключ TypeId и collate-последовательностью "RUSSIAN". if CPCurrent( ) = 1251 then create table d:\WorkT.dbf free (TypeId I unique collate "RUSSIAN", WorkType C(20)) else MessageBox('Установите кодовую страницу 1251') cancel endif REFERENCES TableName2 [TAG TagName1] – указывает родительскую таблицу TableName2, с которой устанавливается постоянная связь. Родительская таблица не должна быть свободной. Параметр TagName1 – это индекс родительской таблицы. Если опция TAG опущена, то в устанавливаемой связи используется первичный ключ таблицы TableName2. Если такового не имеется, то генерируется ошибка. Устанавливаемая таким образом связь, поскольку индексы дочерней и родительской таблиц являются уникальными, имеет вид 1:1. NOCPTRANS – запрещает перевод поля типа Character, Memo или Varchar в другую кодовую страницу; приводит к появлению поля Character (binary), Memo (binary) или Varchar (binary). FieldName2 ... – задает одно или более дополнительных полей и их атрибутов. PRIMARY KEY eExpression2 TAG TagName2 – создает первичный индекс, в котором eExpression2 может содержать произвольное правильно построенное выражение, включающее комбинации полей. Опция PRIMARY KEY может быть использована только единожды. В опции TAG параметр TagName2 – это имя первичного индекса; оно не должно превышать 10 символов. UNIQUE eExpression3 TAG TagName3 – создает кандидатный индекс с именем TagName3. Индексное выражение eExpression3 может содержать произвольное правильно построенное выражение, включающее комбинации полей. Однако если поле уже указано для первичного индекса, оно не может входить в eExpression3. Кандидатных индексов может быть несколько. FOREIGN KEY eExpression4 TAG TagName4 [NODUP] – создает регулярный индекс TagName4 с ключевым выражением eExpression4. Опция NODUP, если задана, означает, что создается не регулярный, а кандидатный индекс. REFERENCES TableName3 TAG TagName5 – задает имя TableName3 родительской таблицы, с которой устанавливается связь, и имя индекса TagName5, на котором эта связь основана. Если опция TAG опущена, то по умолчанию для связи будет использован первичный ключ таблицы TableName3. Если такового нет, то возникнет ошибка. Пример. Создается таблица BookCont; между таблицей BookCont и таблицей WorkType, имеющей первичный индекс TypeId устанавливатся связь. close databases open database d:\HomeLibrary\HomeLibrary.dbc && Изображение установленной связи см. на рис. 15.3 create table d:\BookCont.dbf (BookId Int, TypeId Int, ; foreign key TypeId tag TypeId references WorkType tag TypeId, ; Work Char(50)) Рис. 15.3. Связь, установленная CREATE TABLE CHECK lExpression2 – правило проверки таблицы. Тип выражения lExpression2 – логический. Проверка выполняется и при добавлении чистой записи. ERROR cMessageText2 – сообщение, выдаваемое, если lExpression2 вычисляется со значением .F.; если опция ERROR опущена, то генерируется системное сообщение об ошибке. Пример. При добавлении чистой записи нарушается правило TypeId > 0, заданное командой CREATE TABLE для всей таблицы WorkT. create table d:\WorkT.dbf ; (TypeId I, WorkType C(20), check TypeId > 0 ; error "Значение поля TypeId должно быть положительно") && Добавляем чистую запись append blank && Возникающее при этом сообщение об ошибке приведено на рис. 15.1 Замечание. Проверка для поля в отличие от проверки для таблицы не отделяется от имени поля и описания его типа запятой. FROM ARRAY ArrayName – массив, содержимое которого используется для создания таблицы. Массив может быть сформирован функцией AFIELDS( ). Опция поддерживается только для таблиц, входящих в базу данных, то есть не может употребляться с опцией FREE. С опцией FROM ARRAY нужно употреблять опцию NAME, поскольку в противном случае возникнет неуникальность длинного имени таблицы. Пример. Создается массив, содержащий структуру открытой таблицы WorkType, и затем по его данным создается новая таблица WorkT, входящая в текущую базу данных. if not Used('WorkType') then wait 'Откройте таблицу WorkType' window return endif && Копируем структуру таблицы WorkType в массив Afields(arrayWithTableStructure, 'WorkType') && Создаем новую таблицу WorkT create table d:\WorkT.dbf name WorkT from array arrayWithTableStructure После выполнения команды CREATE TABLE новая таблица открывается в первой неиспользуемой рабочей области. Таблица независимо от установки SET EXCLUSIVE открывается для монопольного доступа. Опции CHECK, DEFAULT, FOREIGN KEY, FROM ARRAY, NAME, PRIMARY KEY и REFERENCES могут употребляться, если создаваемая таблица включается в базу данных, которая в момент выполнения CREATE TABLE должна быть открыта. В противном случае генерируется ошибка. Название опции UNIQUE употребляется для ANSI-совместимости. Кандидатный индекс, создаваемый, если в команде CREATE TABLE – SQL (или ALTER TABLE – SQL) присутствует эта опция, не то же самое, что индекс, создаваемый командой INDEX, использующей опцию UNIQUE. Индекс, создаваемый командой INDEX с опцией UNIQUE разрешает дублирование ключей, в то время как кандидатный индекс это запрещает. Команда ALTER TABLE – SQL ALTER TABLE TableName1 ADD | ALTER [COLUMN] FieldName1
|
Имя поля |
Тип |
Что содержит |
FIELD_NAME |
Character |
Имя поля таблицы-оригинала |
FIELD_TYPE |
Character |
Символ, характеризующий тип поля: W – Blob, C – Character, Y – Currency, N – Numeric, F – Float, I – Integer, B – Double, D – Date, T – DateTime, L – Logical, M – Memo, G – General, Q – Varbinary, V – Varchar и Varchar (Binary) |
FIELD_LEN |
Numeric |
Длина поля |
FIELD_DEC |
Numeric |
Число десятичных позиций (для числовых полей) |
FIELD_NULL |
Logical |
Поддержка NULL |
FIELD_NOCP |
Logical |
Флаг запрета изменения кодовой страницы поля (для символьных и memo-полей) |
FIELD_DEFA |
Memo |
Значение поля по умолчанию |
FIELD_RULE |
Memo |
Правило проверки поля |
FIELD_ERR |
Memo |
Error-текст правила проверки поля |
TABLE_RULE |
Memo |
Правило проверки таблицы (только первая запись) |
TABLE_ERR |
Memo |
Error-текст правила проверки таблицы (только первая запись) |
TABLE_NAME |
Character |
Длинное имя таблицы (только первая запись) |
INS_TRIG |
Memo |
Выражение триггера вставки (только первая запись) |
UPD_TRIG |
Memo |
Выражение триггера обновления (только первая запись) |
DEL_TRIG |
Memo |
Выражение триггера удаления (только первая запись) |
TABLE_CMT |
Memo |
Комментарий таблицы (только первая запись) |
FIELD_NEXT |
Numeric |
Следующее значение для AutoInc-поля |
FIELD_STEP |
Numeric |
Шаг для AutoInc-поля. Нуль означает, что поле не имеет свойства AUTOINC |
Данные таблицы TableName могут быть использованы командой CREATE FROM для создания новой таблицы. Сама же таблица TableName может быть перед употреблением в CREATE FROM отредактирована либо интерактивно, либо программно.
Пример. Создается таблица d:\AuthorsStructure со структурой таблицы Authors, а затем команда CREATE FROM использует d:\AuthorsStructure для получения копии таблицы Authors.
close databases
close tables all
open database d:\HomeLibrary\HomeLibrary.dbc
use Authors in 0
copy structure extended to d:\AuthorsStructure
&& Фрагмент таблицы AuthorsStructure приведен на рис. 15.5
create d:\NewAuthors from d:\AuthorsStructure
use d:\NewAuthors in 0
select NewAuthors
browse last
Рис. 15.5. Фрагмент таблицы AuthorsStructure
Команда
CREATE [FileName1 [DATABASE DatabaseName
[NAME LongTableName]]] FROM [FileName2]
создает таблицу по данным таблицы, построенной командой COPY STRUCTURE EXTENDED.
Созданная таблица открывается и становится текущей.
Опции и параметры:
FileName1 – имя файла создаваемой таблицы. Может включать путь и не содержать расширения.
FROM [FileName2] – имя таблицы, созданной COPY STRUCTURE EXTENDED.
Таблица FileName2 может быть также построена интерактивно или отредактирована после создания COPY STRUCTURE EXTENDED. При этом для создания таблицы FileName1 берутся все записи таблицы FileName2, включая удаленные.
Смысл опций DATABASE и NAME см. в описании команды COPY STRUCTURE TO.