[英]IF EXISTS clause Local SQL
下面的代碼都可以正常工作。 但是,我想知道如何確保僅當student
表中已經存在具有該名稱的學生時,才將“ late”項添加到lates
表中。 我嘗試了多個版本的“ IF EXISTS”和“ WHERE EXISTS”,但似乎語法不正確。 如果student
表中不存在該名稱,我還想返回一個JavaScript錯誤。 所需的更改在addLate
函數中。
<fieldset>
<legend><b>Details</b></legend>
<label>First Name </label><input id = "firstname" type="text" autofocus="" placeholder="Enter first name"><br><br>
<label>Last Name </label><input id = "lastname" type="text" autofocus="" placeholder="Enter last name"><br><br>
</fieldset>
<fieldset>
<legend><b>Information</b></legend>
<label> Current date:</label>
<input type="text" id="datelate"/><br><br>
<label> Detention date:</label>
<input id = "detentiondate" type="date" ><br><br>
<label>Time</label>
<select id="mora">
<option value="AM">Morning</option>
<option value="PM">Afternoon</option>
</select>
<br> <br>
<label> Reason:</label>
<textarea id = "reason" rows="2" cols="60"></textarea><br><br>
</fieldset>
<br>
<input type="reset" value="Reset">
<button type="button" id="addlate" onclick="addLate();">Add late</button>
</body>
<script>
if (window.openDatabase) {
var mydb = openDatabase("students2_db", "0.1", "A Database of Students", 1024 * 1024);
mydb.transaction(function (t) {
t.executeSql("CREATE TABLE IF NOT EXISTS student (id INTEGER PRIMARY KEY ASC, fname TEXT, lname TEXT, mclass TEXT, aclass TEXT, com TEXT, lates INTEGER DEFAULT 0)");
t.executeSql("CREATE TABLE IF NOT EXISTS lates (lid INTEGER PRIMARY KEY ASC, flname TEXT, llname TEXT, time TEXT, reason TEXT, date TEXT, nextdet TEXT)");
});
} else {
alert("WebSQL is not supported by your browser!");
}
function ClearFunction() {
document.getElementById("mora").value = "";
}
function DateFunction() {
var today = new Date();
var dd = today.getDate();
var mm = today.getMonth()+1; //January is 0!
var yyyy = today.getFullYear();
if(dd<10) {
dd='0'+dd
}
if(mm<10) {
mm='0'+mm
}
today = dd+'-'+mm+'-'+yyyy;
document.getElementById('datelate').value= today;
}
function addLate() {
if (mydb) {
var flname = document.getElementById("firstname").value;
var llname = document.getElementById("lastname").value;
var date = document.getElementById("datelate").value;
var nextdet = document.getElementById("detentiondate").value;
var time = document.getElementById("mora").value;
var reason = document.getElementById("reason").value;
if (flname !== "" && date !== "" && nextdet !== "" && llname !== "" && reason !== "" && time !== "") {
mydb.transaction(function (t) {
t.executeSql("INSERT INTO lates (flname,llname,time,reason,date,nextdet) VALUES (?,?,?,?,?,?)" , [flname,llname,time,reason,date,nextdet]);
t.executeSql("UPDATE student SET lates = lates + 1 WHERE lname =? ", [llname]);
alert("Entry succesfully added");
document.getElementById("firstname").value = "";
document.getElementById("lastname").value = "";
document.getElementById("detentiondate").value = "";
document.getElementById("reason").value = "";
});
} else {
alert("You must fill out all the empty information!");
}
} else {
alert("db not found, your browser does not support web sql!");
}
}
</script>
您可以使用帶有學生ID的簡單SELECT
查詢來檢查學生是否在學生數據庫中,然后使用返回的行數來確定該學生是否存在。 如果行返回> 0,則說明您的學生存在,否則,該學生不存在。
像這樣:
SELECT id
FROM student
WHERE id = 'student's id'
最好的方法是在lates
表上添加外鍵約束 ,這樣,如果students
沒有相應的條目,則數據庫會將行插入到lates
是錯誤的。
在您的情況下,這歸因於您沒有正確規范化表的事實。 在數據庫的設計是考慮壞的形式具有包括在復式表相同的信息:因此,而不是反復在每個學生的名字和姓氏lates
表,你只需要包括特定於該表和引用的一切信息否則回到students
桌。
因此,我將使您的lates
表如下所示:
CREATE TABLE IF NOT EXISTS lates (
lid INTEGER PRIMARY KEY ASC,
student_id INTEGER REFERENCES student(id)
time TEXT,
reason TEXT,
date TEXT,
nextdet TEXT
)
請注意,不是將fname和lname直接包含在此表中,而是具有student_id
,它是對Student表的ID列的外鍵引用。 現在,如果您嘗試在students
表中不存在一個student_id插入到lates
表中,則會自動出現錯誤。
您可能想知道如何在顯示學生的實際姓名的同時,在lates
表中顯示信息-這是通過聯接完成的:
SELECT fname,
lname,
time,
reason
FROM lates
LEFT JOIN students ON lates.student_id=student.id;
順便說一句,我假設您知道Web數據庫已被棄用,因此將其用於任何實際項目可能不是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.