第一章 SQL命令 ALTER TABLE(一)
文章目錄
- 第一章 SQL命令 ALTER TABLE(一)
- 大綱
- 參數(shù)
- 描述
- 權(quán)限和鎖
- 重命名表
- 添加列限制
- 添加整數(shù)計(jì)數(shù)器
- 更改列限制
- 修改列的限制
第一章 SQL命令 ALTER TABLE(一)
修改表。
大綱
ALTER TABLE table alter-actionwhere alter-action is one of the following:ADD [(] add-action {,add-action} [)] |DROP [COLUMN ] drop-column-action {,drop-column-action} |DROP drop-action |DELETE drop-action |ALTER [COLUMN] field alter-column-action |MODIFY modification-spec {,modification-spec}RENAME tableadd-action ::= [CONSTRAINT identifier][(] FOREIGN KEY (field-commalist) REFERENCES table (field-commalist)[ON DELETE ref-action] [ON UPDATE ref-action] [NOCHECK] [)]|[(] UNIQUE (field-commalist) [)] |[(] PRIMARY KEY (field-commalist) [)] | DEFAULT [(] default-spec [)] FOR field|[COLUMN] [(] field datatype [sqlcollation] [%DESCRIPTION string][DEFAULT [(] default-spec [)] ][ON UPDATE update-spec ][UNIQUE] [NOT NULL][REFERENCES table (field-commalist) [ON DELETE ref-action] [ON UPDATE ref-action] [NOCHECK] ][)]drop-column-action ::= [COLUMN] field [RESTRICT | CASCADE] [%DELDATA | %NODELDATA] drop-action ::= FOREIGN KEY identifier |PRIMARY KEY |CONSTRAINT identifier |alter-column-action ::= RENAME newfieldname |datatype | [SET] DEFAULT [(] default-spec [)] | DROP DEFAULT | NULL | NOT NULL | COLLATE sqlcollationmodification-spec ::=oldfieldname RENAME newfieldname |field [datatype] [DEFAULT [(] default-spec [)]][CONSTRAINT identifier] [NULL] [NOT NULL]sqlcollation ::={ %EXACT | %MINUS | %MVR | %PLUS | %SPACE | %SQLSTRING [(maxlen)] | %SQLUPPER [(maxlen)] |%TRUNCATE[(maxlen)] }參數(shù)
| table | 要更改的表的名稱。表名可以是限定的(schema.table),也可以是非限定的(table)。非限定的表名采用默認(rèn)的架構(gòu)名。不使用架構(gòu)搜索路徑值。 |
| identifier | 分配給約束的唯一名稱。必須是有效的標(biāo)識(shí)符。 |
| field | 要更改(添加、修改、刪除)的列的名稱。必須是有效的標(biāo)識(shí)符。 |
| field-commalist | 列的名稱或逗號(hào)分隔的列列表。即使只指定了一列,字段命令列表也必須用括號(hào)括起來(lái)。 |
| datatype | 有效的SQL數(shù)據(jù)類型。 |
| default-spec | 如果未被用戶提供的數(shù)據(jù)值覆蓋,則自動(dòng)為此字段提供的默認(rèn)數(shù)據(jù)值。允許的值有:文字值;以下關(guān)鍵字選項(xiàng)之一(NULL, USER, CURRENT_USER, SESSION_USER, SYSTEM_USER, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP);或者OBJECTSCRIPT表達(dá)式。不要將SQL零長(zhǎng)度字符串用作默認(rèn)值。 |
| update-spec | 見(jiàn)CREATE TABLE中的更新。 |
| COLLATE sqlcollation | 可選-指定以下SQL排序規(guī)則類型之一:%EXACT, %MINUS, %PLUS, %SPACE, %SQLSTRING, %SQLUPPER, %TRUNCATE, %MVR。默認(rèn)值為名稱空間默認(rèn)排序規(guī)則(除非更改,否則為%SQLUPPER)。%SQLSTRING、%SQLUPPER和%TRUNCATE可以使用可選的最大長(zhǎng)度截?cái)鄥?shù)(括在圓括號(hào)中的整數(shù))指定。這些排序規(guī)則參數(shù)關(guān)鍵字的百分比符號(hào)(%)前綴是可選的。COLLATE關(guān)鍵詞是可選的。 |
描述
ALTER TABLE語(yǔ)句修改表定義;它可以添加元素、刪除元素或修改現(xiàn)有元素。在每個(gè)ALTER TABLE語(yǔ)句中只能執(zhí)行一種類型的操作。
- RENAME可以重命名表,也可以使用ALTER COLUMN或MODIFY語(yǔ)法重命名表中的現(xiàn)有列。
- Add可以向表中添加多個(gè)列和/或約束。只需指定一次ADD關(guān)鍵字,后跟一個(gè)逗號(hào)分隔的列表。可以使用逗號(hào)分隔的列表向表中添加多個(gè)新列,向現(xiàn)有列中添加約束條件列表,或者同時(shí)向現(xiàn)有列中添加新列和約束條件。
- DROP COLUMN可以從表中刪除多列。只需指定一次DROP關(guān)鍵字,然后是一個(gè)逗號(hào)分隔的列列表,每個(gè)列都有可選的級(jí)聯(lián)和/或數(shù)據(jù)刪除選項(xiàng)。
- ALTER COLUMN可以更改單個(gè)列的定義。它不能更改多列。
- MODIFY 可以更改單個(gè)列或逗號(hào)分隔的列列表的定義。它不支持ALTER COLUMN提供的所有選項(xiàng)。
- 刪除可以從一個(gè)或一組字段中刪除約束。DROP只能對(duì)單個(gè)約束進(jìn)行操作。
ALTER TABLE DROP關(guān)鍵字和ALTER TABLE DELETE關(guān)鍵字是同義詞。
要確定當(dāng)前命名空間中是否存在指定表,請(qǐng)使用$SYSTEM.SQL.Schema.TableExists()方法。
權(quán)限和鎖
ALTER TABLE命令是特權(quán)操作。用戶必須具有%ALTER_TABLE管理權(quán)限才能執(zhí)行ALTER TABLE。否則將導(dǎo)致SQLCODE-99錯(cuò)誤 the %msg User 'name' does not have %ALTER_TABLE privileges.。
用戶必須對(duì)指定表?yè)碛?ALTER特權(quán)。如果用戶是表的所有者(創(chuàng)建者),則會(huì)自動(dòng)授予該用戶對(duì)該表的%ALTER權(quán)限。否則,必須授予用戶對(duì)該表的%ALTER特權(quán)。否則將導(dǎo)致SQLCODE-99錯(cuò)誤 %msg User 'name' does not have required %ALTER privilege needed to change the table definition for 'Schema.TableName'.
要確定當(dāng)前用戶是否具有%ALTER特權(quán),請(qǐng)調(diào)用%CHECKPRIV命令。要確定指定用戶是否具有%ALTER權(quán)限,請(qǐng)調(diào)用$SYSTEM.SQL.Security.CheckPrivileve()方法。
要分配所需的管理權(quán)限,請(qǐng)使用具有%ALTER_TABLE權(quán)限的GRANT命令;這需要適當(dāng)?shù)氖谟铏?quán)限。要分配%ALTER OBJECT權(quán)限,可以使用:
- 具有%ALTER權(quán)限的GRANT命令。這需要適當(dāng)?shù)氖谟铏?quán)限。
- 在用于編輯角色或用戶的頁(yè)面上,管理門戶中的SQL表選項(xiàng)卡上的表的更改復(fù)選框。這需要適當(dāng)?shù)氖谟铏?quán)限。
在嵌入式SQL中,可以使用$SYSTEM.Security.Login()方法以具有適當(dāng)權(quán)限的用戶身份登錄:
DO $SYSTEM.Security.Login("_SYSTEM","SYS")&sql( )必須具有%Service_Login:Use權(quán)限才能調(diào)用$SYSTEM.Security.Login方法。
- 除非表類定義包括[DdlAllowed],否則不能對(duì)從持久類投影的表使用ALTER TABLE。否則,操作將失敗,并顯示SQLCODE-300錯(cuò)誤the %msg DDL not enabled for class 'Schema.tablename'.
- ALTER TABLE不能用于從部署的持久類投射的表。此操作失敗,并顯示SQLCODE-400錯(cuò)誤the %msg Unable to execute DDL that modifies a deployed class: 'classname'.
ALTER TABLE獲取對(duì)TABLE的表級(jí)鎖。這可以防止其他進(jìn)程修改表的數(shù)據(jù)。此鎖在ALTER TABLE操作結(jié)束時(shí)自動(dòng)釋放。當(dāng)ALTER TABLE鎖相應(yīng)的類定義時(shí),它使用當(dāng)前進(jìn)程的SQL Lock超時(shí)設(shè)置。
若要更改表,表不能在獨(dú)占模式或共享模式下被另一個(gè)進(jìn)程鎖定。更改鎖定的表會(huì)導(dǎo)致SQLCODE-110錯(cuò)誤,a %msg such as the following: Unable to acquire exclusive table lock for table 'Sample.MyTest'.
重命名表
可以使用以下語(yǔ)法重命名現(xiàn)有表:
ALTER TABLE schema.TableName RENAME NewTableName此操作重命名其現(xiàn)有架構(gòu)中的現(xiàn)有表。只能更改表名,而不能更改表架構(gòu)。在NewTableName中指定架構(gòu)名稱會(huì)導(dǎo)致SQLCODE-1錯(cuò)誤。為舊表和新表指定相同的表名會(huì)生成SQLCODE-201錯(cuò)誤。
重命名表會(huì)更改SQL表名。它不會(huì)更改相應(yīng)的永久類名。
重命名表不會(huì)更改對(duì)觸發(fā)器中舊表名的引用。
如果視圖引用現(xiàn)有表名稱,則重命名該表將失敗。這是因?yàn)閲L試重命名表是一個(gè)原子操作,會(huì)導(dǎo)致視圖重新編譯,從而生成SQLCODE-30錯(cuò)誤。 “Table 'schema.oldname' not found”.
添加列限制
添加列可以添加單個(gè)列,也可以添加逗號(hào)分隔的列列表。
如果嘗試通過(guò)ALTER TABLE TABLE NAME ADD COLUMN語(yǔ)句將字段添加到表中:
- 如果該名稱的列已經(jīng)存在,則該語(yǔ)句將失敗,并顯示SQLCODE-306錯(cuò)誤。
- 如果語(yǔ)句對(duì)列指定了NOT NULL約束,并且該列沒(méi)有默認(rèn)值,則如果表中已存在數(shù)據(jù),則該語(yǔ)句將失敗。這是因?yàn)?#xff0c;在完成DDL語(yǔ)句之后,不滿足所有預(yù)先存在的行的NOT NULL約束。這將生成錯(cuò)誤代碼SQLCODE-304(試圖向包含數(shù)據(jù)的表中添加一個(gè)沒(méi)有默認(rèn)值的非空字段)。
- 如果語(yǔ)句對(duì)列指定了NOT NULL約束,并且該列有默認(rèn)值,則該語(yǔ)句將更新表中的所有現(xiàn)有行,并將該列的默認(rèn)值分配給該字段。這包括CURRENT_TIMESTAMP等默認(rèn)值。
- 如果該語(yǔ)句沒(méi)有對(duì)列指定NOT NULL約束,并且該列有默認(rèn)值,則在任何現(xiàn)有行中都不會(huì)更新該列。這些行的列值為NULL。
要更改此默認(rèn)的NOT NULL約束行為,參考SET OPTION命令的COMPILEMODE=NOCHECK選項(xiàng)。
如果指定了名為“ID”的普通數(shù)據(jù)字段,而RowID字段已經(jīng)命名為“ID”(默認(rèn)值),則添加列操作將成功。ALTER TABLE添加ID數(shù)據(jù)列,并將RowId列重命名為“ID1”以避免重復(fù)名稱。
添加整數(shù)計(jì)數(shù)器
如果通過(guò)ALTER TABLE TABLE NAME ADD COLUMN語(yǔ)句將整數(shù)計(jì)數(shù)器字段添加到表中:
- 如果表沒(méi)有標(biāo)識(shí)字段,則可以向該表添加標(biāo)識(shí)字段。如果表已有標(biāo)識(shí)字段,則ALTER TABLE操作將失敗,并顯示SQLCODE-400錯(cuò)誤,并顯示如下%msg:ERROR #5281: Class has multiple identity properties: 'Sample.MyTest::MyIdent2'。使用添加列定義此字段時(shí), IRIS將使用相應(yīng)的RowID整數(shù)值填充此字段的現(xiàn)有數(shù)據(jù)行。
如果CREATE TABLE定義了位圖區(qū)索引,然后將標(biāo)識(shí)字段添加到表中,并且標(biāo)識(shí)字段不是MINVAL為1或更高的類型%BigInt、%Integer、%SmallInt或%TinyInt,并且表中沒(méi)有數(shù)據(jù),則系統(tǒng)會(huì)自動(dòng)刪除位圖區(qū)索引。
- 可以向表中添加一個(gè)或多個(gè)序列(%Library.Counter)字段。使用“添加列”定義此字段時(shí),此字段的現(xiàn)有數(shù)據(jù)行為空。可以使用UPDATE向此字段為NULL的現(xiàn)有數(shù)據(jù)行提供值;不能使用UPDATE更改非NULL值。
- 如果表沒(méi)有ROWVERSION字段,則可以向該表添加ROWVERSION字段。如果表已具有ROWVERSION字段,則ALTER TABLE操作將失敗,并顯示SQLCODE-400錯(cuò)誤,并顯示如下%msg:: ERROR #5320: Class 'Sample.MyTest' has more than one property of type %Library.RowVersion. Only one is allowed. Properties: MyVer,MyVer2.使用添加列定義此字段時(shí),此字段的現(xiàn)有數(shù)據(jù)行為NULL;不能更新為NULL的ROWVERSION值。
更改列限制
ALTER COLUMN可以修改單個(gè)列的定義:
- 使用語(yǔ)法ALTER TABLE TABLE NAME ALTER COLUMN oldname rename newname重命名列。重命名列會(huì)更改SQL字段名稱。它不會(huì)更改相應(yīng)的持久類屬性名稱。ALTER COLUMN OLDNAME RENAME NEWNAME替換觸發(fā)器代碼和ComputeCode中的舊字段名稱引用。
- 更改列特征:數(shù)據(jù)類型、默認(rèn)值、NULL/NOT NULL和排序規(guī)則類型。
如果表包含數(shù)據(jù),則不能更改包含數(shù)據(jù)的列的數(shù)據(jù)類型,如果更改將導(dǎo)致流數(shù)據(jù)類型為非流數(shù)據(jù)或非流數(shù)據(jù)類型為流數(shù)據(jù)。
嘗試這樣做會(huì)導(dǎo)致SQLCODE -374錯(cuò)誤。
如果沒(méi)有現(xiàn)有數(shù)據(jù),則允許這種類型的數(shù)據(jù)類型更改。
可以使用ALTER COLUMN添加、更改或刪除字段默認(rèn)值。
如果表包含數(shù)據(jù),如果列包含空值,則不能指定NOT NULL;
這將導(dǎo)致SQLCODE -305錯(cuò)誤。
如果更改包含數(shù)據(jù)的列的排序規(guī)則類型,則必須重新構(gòu)建該列的所有索引。
修改列的限制
MODIFY可以修改單個(gè)列或用逗號(hào)分隔的列列表的定義。
- 使用語(yǔ)法ALTER TABLE tablename MODIFY oldname RENAME newname重命名該列。重命名列會(huì)更改SQL字段名稱。它不會(huì)更改相應(yīng)的持久類屬性名稱。Modify oldname重命名newname替換觸發(fā)器代碼和ComputeCode中的舊字段名稱引用。
- 更改列特征:數(shù)據(jù)類型、默認(rèn)值和其他特征。
如果表包含數(shù)據(jù),則不能將包含數(shù)據(jù)的列的數(shù)據(jù)類型更改為不兼容的數(shù)據(jù)類型:
- 數(shù)據(jù)類型優(yōu)先級(jí)較低(包含較少)的數(shù)據(jù)類型,如果這與現(xiàn)有數(shù)據(jù)值沖突。嘗試這樣做會(huì)導(dǎo)致SQLCODE-104錯(cuò)誤,其中%msg指定哪個(gè)字段和哪個(gè)數(shù)據(jù)值導(dǎo)致錯(cuò)誤。
- 具有較小MAXLEN或MAXVAL/MINVAL(如果這與現(xiàn)有數(shù)據(jù)值沖突)的數(shù)據(jù)類型。嘗試這樣做會(huì)導(dǎo)致SQLCODE-104錯(cuò)誤,其中%msg指定哪個(gè)字段和哪個(gè)數(shù)據(jù)值導(dǎo)致錯(cuò)誤。
- 數(shù)據(jù)類型從流數(shù)據(jù)類型改變?yōu)榉橇鲾?shù)據(jù)類型或從非流數(shù)據(jù)類型改變?yōu)榱鲾?shù)據(jù)類型。嘗試這樣做會(huì)導(dǎo)致SQLCODE-374錯(cuò)誤。如果沒(méi)有現(xiàn)有數(shù)據(jù),則允許這種類型的數(shù)據(jù)類型更改。
可以使用修改來(lái)添加或更改字段默認(rèn)值。不能使用修改來(lái)刪除字段默認(rèn)值。
如果表包含數(shù)據(jù),如果列包含空值,則不能為該列指定NOT NULL;這會(huì)導(dǎo)致SQLCODE-305錯(cuò)誤。語(yǔ)法形式 ALTER TABLE mytable MODIFY field1 NOT NULL and ALTER TABLE mytable MODIFY field1 CONSTRAINT nevernull NOT NULL執(zhí)行相同的操作。可選的約束標(biāo)識(shí)符子句是為兼容而提供的無(wú)操作。不保留或使用此字段約束名稱。試圖通過(guò)指定此字段約束名稱刪除此字段約束會(huì)導(dǎo)致SQLCODE-315錯(cuò)誤。
總結(jié)
以上是生活随笔為你收集整理的第一章 SQL命令 ALTER TABLE(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Go在谷歌:以软件工程为目的的语言设计
- 下一篇: mybatis动态sql中的where标