Oracle 01723錯(cuò)誤一般出現(xiàn)在多表查詢(xún)語(yǔ)句中,表示沒(méi)有找到關(guān)聯(lián)的外鍵。具體的說(shuō),就是查詢(xún)中的某個(gè)外鍵沒(méi)有找到對(duì)應(yīng)的主鍵。
下面我們來(lái)看一個(gè)例子:
SELECT * FROM table1 JOIN table2 ON table1.key = table2.key;
如果在執(zhí)行這個(gè)查詢(xún)語(yǔ)句時(shí),出現(xiàn)了01723錯(cuò)誤,那么大多數(shù)情況下都是因?yàn)楸?和表2的key字段沒(méi)有正確地設(shè)置外鍵和主鍵關(guān)系。
正確的做法是在表1的key字段上添加主鍵約束,在表2的key字段上添加外鍵約束,并將兩者之間建立聯(lián)系,示例如下:
ALTER TABLE table1 ADD CONSTRAINT pk_table1_key PRIMARY KEY (key); ALTER TABLE table2 ADD CONSTRAINT fk_table2_key FOREIGN KEY (key) REFERENCES table1(key);
以上代碼中,pk_table1_key表示表1的key字段主鍵約束,fk_table2_key表示表2的key字段外鍵約束,REFERENCES關(guān)鍵字表示將表2的key字段和表1的key字段建立關(guān)聯(lián)。
除了沒(méi)有正確設(shè)置外鍵和主鍵關(guān)系,其他情況下也有可能出現(xiàn)01723錯(cuò)誤。例如:
SELECT * FROM table1 WHERE table1.key = (SELECT key FROM table2 WHERE col1 = 'value');
在這個(gè)查詢(xún)語(yǔ)句中,如果在table2表中找不到col1等于'value'的記錄,那么子查詢(xún)返回的結(jié)果集就為空,table1.key = NULL,就會(huì)導(dǎo)致01723錯(cuò)誤。
因此,我們可以在SQL代碼中加入一些防止01723錯(cuò)誤的邏輯判斷。例如,判斷子查詢(xún)返回的結(jié)果是否為空:
SELECT * FROM table1 WHERE table1.key = ( SELECT key FROM table2 WHERE col1 = 'value' AND key IS NOT NULL -- 判斷子查詢(xún)返回的結(jié)果是否為空 );
在以上代碼中,我們添加了一個(gè)AND key IS NOT NULL的判斷條件,避免了子查詢(xún)返回的結(jié)果為空的情況下導(dǎo)致的01723錯(cuò)誤。
總的來(lái)說(shuō),出現(xiàn)Oracle 01723錯(cuò)誤的原因有很多,主要與外鍵和主鍵的設(shè)置、SQL代碼中的邏輯判斷等有關(guān)。我們?cè)谑褂肙racle數(shù)據(jù)庫(kù)進(jìn)行開(kāi)發(fā)時(shí),要注意細(xì)節(jié),加強(qiáng)對(duì)SQL語(yǔ)句的理解和掌握,防止出現(xiàn)錯(cuò)誤。