In Oracle können Sie die Anweisung „ALTER TABLE MODIFY“ verwenden, um Felder zu ändern. Die Syntax lautet „Auszuführende Operationen ALTER TABLE MODIFY“; Standardwert einer Spalte ändern, den Ausdruck virtueller Spalten ändern usw.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, Oracle 11g-Version, Dell G3-Computer.
In Oracle können Sie die Anweisung „ALTER TABLE MODIFY
“ verwenden, um Felder zu ändern und die Definition vorhandener Felder zu ändern. ALTER TABLE MODIFY
”语句来修改字段,更改现有字段的定义。
要更改表中列的定义,请按如下所示使用ALTER TABLE MODIFY
列语法:
ALTER TABLE 表名 MODIFY 字段名 需要执行的操作;
语句很直接。要修改表的列,需要指定要执行的列名,表名和操作。
Oracle允许执行多种操作,但以下是主要常用的操作:
修改列的可见性
允许或不允许NULL值
缩短或扩大列的大小
更改列的默认值
修改虚拟列的表达式
要修改多个列,请使用以下语法:
ALTER TABLE 表名 MODIFY ( 字段名1 action, 字段名2 action, ... );
首先,为演示创建一个名为accounts
的新表:
-- 12c语法 CREATE TABLE accounts ( account_id NUMBER GENERATED BY DEFAULT AS IDENTITY, first_name VARCHAR2(25) NOT NULL, last_name VARCHAR2(25) NOT NULL, email VARCHAR2(100), phone VARCHAR2(12) , full_name VARCHAR2(51) GENERATED ALWAYS AS( first_name || ' ' || last_name ), PRIMARY KEY(account_id) );
其次,向accounts
表中插入一些行:
INSERT INTO accounts(first_name,last_name,phone) VALUES('Trinity', 'Knox', '410-555-0197'); INSERT INTO accounts(first_name,last_name,phone) VALUES('Mellissa', 'Porter', '410-555-0198'); INSERT INTO accounts(first_name,last_name,phone) VALUES('Leeanna', 'Bowman', '410-555-0199');
第三,通过使用下面的SELECT
语句验证插入操作:
SELECT * FROM accounts;
执行上面查询语句,得到以下结果 -
1. 修改列的可见性
在Oracle 12c中,可以将表列定义为不可见或可见。不可见列不可用于查询,如:
SELECT * FROM table_name;
或者,
DESCRIBE table_name;
都是查到不到不可见列的。
但是,可以通过在查询中显式指定不可见列来查询:
SELECT invisible_column_1, invisible_column_2 FROM table_name;
默认情况下,表列是可见的。可以在创建表或使用ALTER TABLE MODIFY
列语句时定义不可见列。
例如,以下语句使full_name
列不可见:
ALTER TABLE accounts MODIFY full_name INVISIBLE;
执行再次查询表中数据,得到以下结果 -
以下语句返回accounts
表除了full_name
列以外的所有列中返回数据:
SELECT * FROM accounts;
这是因为full_name
列是不可见的。要将列从不可见变为可见,请使用以下语句:
ALTER TABLE accounts MODIFY full_name VISIBLE;
2. 允许或不允许null示例
以下语句将email
列更改为接受非空(not null
)值:
ALTER TABLE accounts MODIFY email VARCHAR2( 100 ) NOT NULL;
但是,Oracle发出以下错误:
SQL Error: ORA-02296: cannot enable (OT.) - null values found
因为当将列从可为null
改为not null
时,必须确保现有数据符合新约束(也就是说,如果原来数据中NULL
是不行的)。
为了解决这个问题,首先更新email
列的值:
UPDATE accounts SET email = LOWER(first_name || '.' || last_name || '@oraok.com') ;
请注意,LOWER()函数将字符串转换为小写字母。
然后改变email
列的约束:
ALTER TABLE accounts MODIFY email VARCHAR2( 100 ) NOT NULL;
现在,它应该就会按预期那样工作了。
3. 扩大或缩短列示例的大小
假设要添加国际代码到phone
列上,比如:前缀加上+86
。 在修改列的值之前,必须使用以下语句扩大phone
列的大小:
ALTER TABLE accounts MODIFY phone VARCHAR2( 24 );
现在,我们可以更新电话号码的数据了:
UPDATE accounts SET phone = '+86 ' || phone;
以下语句验证更新:
SELECT * FROM accounts;
执行上面查询语句结果中,应该可以看到原电话号码前缀有加上+86
的国际区号了。
要缩短列的大小,请确保列中的所有数据都符合新的大小。
例如,尝试将phone
列的大小缩减到12
个字符:
ALTER TABLE accounts MODIFY phone VARCHAR2( 12 );
Oracle数据库发出以下错误:
SQL Error: ORA-01441: cannot decrease column length because some value is too big
要解决这个问题,首先,应该从电话号码中删除国际代码(即:+86
):
UPDATE accounts SET phone = REPLACE( phone, '+86 ', '' );
REPLACE()函数用一个新的子字符串替换一个子字符串。在这种情况下,它将用空字符串替换+86
。
然后缩短phone
列的大小:
ALTER TABLE accounts MODIFY phone VARCHAR2( 12 );
4. 修改虚拟列
假设按以下两列的格式填写全名:
last_name, first_name
为此,可以更改虚拟列full_name
ALTER TABLE MODIFY
wie folgt: 🎜ALTER TABLE accounts MODIFY full_name VARCHAR2(52) GENERATED ALWAYS AS (last_name || ', ' || first_name);🎜Die Anweisung ist unkompliziert. Um die Spalten einer Tabelle zu ändern, müssen Sie den Spaltennamen, den Tabellennamen und den auszuführenden Vorgang angeben. 🎜🎜Oracle ermöglicht Ihnen die Ausführung einer Vielzahl von Vorgängen, die folgenden sind jedoch die am häufigsten verwendeten Vorgänge: 🎜
SELECT * FROM accounts;
accounts
für die Demo: 🎜ALTER TABLE accounts ADD status NUMBER( 1, 0 ) DEFAULT 1 NOT NULL ;🎜🎜Zweitens 🎜 fügen Sie einige Zeilen in die
accounts
ein Tabelle: 🎜ALTER TABLE accounts MODIFY status DEFAULT 0;🎜🎜Drittens 🎜, überprüfen Sie den Einfügevorgang mit der folgenden
SELECT
-Anweisung: 🎜INSERT INTO accounts ( first_name, last_name, email, phone ) VALUES ( 'Julia', 'Madden', 'julia.madden@oraok.com', '410-555-0200' );🎜Führen Sie die obige Abfrageanweisung aus und erhalten Sie die folgenden Ergebnisse -🎜🎜🎜🎜🎜1. Ändern Sie die Sichtbarkeit von Spalten 🎜🎜🎜In Oracle 12c können Tabellenspalten als unsichtbar oder sichtbar definiert werden. Unsichtbare Spalten können nicht für Abfragen verwendet werden, z. B.: 🎜
SELECT * FROM accounts;🎜 oder 🎜rrreee🎜. Unsichtbare Spalten können nicht gefunden werden. 🎜🎜Es ist jedoch möglich, unsichtbare Spalten abzufragen, indem man sie explizit in der Abfrage angibt: 🎜rrreee🎜Tabellenspalten sind standardmäßig sichtbar. Unsichtbare Spalten können beim Erstellen der Tabelle oder mithilfe der Spaltenanweisung
ALTER TABLE MODIFY
definiert werden. 🎜🎜Zum Beispiel macht die folgende Anweisung die Spalte vollständiger_Name
unsichtbar: 🎜rrreee🎜Führen Sie die Abfrage der Daten in der Tabelle erneut aus und erhalten Sie die folgenden Ergebnisse: 🎜🎜🎜🎜Die folgende Anweisung gibt die accounts
zurück Tabelle außer full_name zurück: 🎜rrreee🎜 Dies liegt daran, dass die Spalte <code>full_name
nicht sichtbar ist. Um eine Spalte von unsichtbar in sichtbar zu ändern, verwenden Sie die folgende Anweisung: 🎜rrreee🎜🎜2. Nullbeispiel zulassen oder nicht zulassen🎜🎜🎜Die folgende Anweisung wird Die Spalte email
wurde so geändert, dass sie Nicht-Null-Werte (nicht null
) akzeptiert: 🎜rrreee🎜 Oracle gibt jedoch den folgenden Fehler aus: 🎜rrreee🎜, weil beim Ändern der Spalte „Verfügbar“ die Spalte „E-Mail“ geändert wird zu Wenn null
in nicht null
geändert wird, müssen Sie sicherstellen, dass die vorhandenen Daten den neuen Einschränkungen entsprechen (d. h., wenn NULL
nicht ist). in den Originaldaten erlaubt). 🎜🎜Um dieses Problem zu lösen, aktualisieren Sie zunächst den Wert der Spalte email
: 🎜rrreee🎜Bitte beachten Sie, dass LOWER() wandelt einen String in Kleinbuchstaben um. 🎜🎜Ändern Sie dann die Einschränkung für die Spalte email
: 🎜rrreee🎜Jetzt sollte es wie erwartet funktionieren. 🎜🎜🎜3. Erweitern oder verkürzen Sie die Größe des Spaltenbeispiels🎜🎜🎜Angenommen, Sie möchten internationale Vorwahlen zum Telefon
hinzufügen > Spalte, wie zum Beispiel: Präfix mit +86
. Bevor Sie den Wert der Spalte ändern, müssen Sie die Größe der Spalte phone
mit der folgenden Anweisung erweitern: 🎜rrreee🎜Jetzt können wir die Telefonnummerndaten aktualisieren: 🎜rrreee🎜Die folgende Anweisung überprüft die Update: 🎜rrreee🎜Execute In den Ergebnissen der obigen Abfrageanweisung sollten Sie sehen können, dass die ursprüngliche Telefonnummer die internationale Vorwahl mit dem Präfix +86
hat. 🎜🎜🎜🎜An Verkürzen Sie die Größe einer Spalte und stellen Sie sicher, dass alle Daten in der Spalte der neuen Größe entsprechen. 🎜🎜Versuchen Sie beispielsweise, die Größe der Spalte phone
auf 12
Zeichen zu reduzieren: 🎜rrreee🎜Oracle Database gibt den folgenden Fehler aus: 🎜rrreee🎜Um dieses Problem zunächst zu beheben , sollten Sie internationale Vorwahlen von Telefonnummern entfernen (z. B.: +86
): 🎜rrreee🎜REPLACE()-Funktion ersetzt einen Teilstring durch einen neuen Teilstring. In diesem Fall wird +86
durch die leere Zeichenfolge ersetzt. 🎜🎜Dann verkürzen Sie die Größe der Spalte phone
: 🎜rrreee🎜🎜4. Ändern Sie die virtuelle Spalte🎜🎜🎜Angenommen, Sie Drücken Sie die folgenden zwei Spalten. Geben Sie den vollständigen Namen im Format ein: 🎜rrreee🎜 Dazu können Sie den Ausdruck der virtuellen Spalte vollständiger_Name
wie folgt ändern: 🎜ALTER TABLE accounts MODIFY full_name VARCHAR2(52) GENERATED ALWAYS AS (last_name || ', ' || first_name);
以下语句验证修改:
SELECT * FROM accounts;
执行上面查询语句,可以看到以下结果
5. 修改列的默认值
添加一个名为status
的新列,默认值为1
到accounts
表中。参考以下语句 -
ALTER TABLE accounts ADD status NUMBER( 1, 0 ) DEFAULT 1 NOT NULL ;
当执行了该语句,就会将accounts
表中的所有现有行的status
列中的值设置为1
。
要将status
列的默认值更改为0
,请使用以下语句:
ALTER TABLE accounts MODIFY status DEFAULT 0;
可以在accounts
表中添加一个新行来检查status
列的默认值是0
还是1
:
INSERT INTO accounts ( first_name, last_name, email, phone ) VALUES ( 'Julia', 'Madden', 'julia.madden@oraok.com', '410-555-0200' );
现在,查询accounts
表中的数据:
SELECT * FROM accounts;
执行上面查询语句,应该看类似下面的结果
正如所看到的那样,ID
为4
的账户的status
列的值是0
。
推荐教程:《Oracle教程》
Das obige ist der detaillierte Inhalt vonSo ändern Sie Felder in der Oracle-Datenbank. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!