IF EXISTS子句本地SQL

时间:2015-07-08 01:17:59

标签: javascript sql sqlite

以下代码一切正常。但是,我想知道如何确保如果lates表中已存在具有该名称的学生,则仅将“迟”条目添加到student表中。我尝试了几个版本的'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>

2 个答案:

答案 0 :(得分:1)

您可以使用简单的SELECT查询使用学生ID来检查学生是否在学生数据库中,然后使用返回的行数来确定学生是否存在。如果行返回&gt; 0,然后你的学生存在,否则,学生不存在。

这样的事情:

SELECT id
FROM student
WHERE id = 'student's id'

答案 1 :(得分:1)

实现此目的的最佳方法是在lates表上添加foreign key constraint,以便数据库认为如果没有相应的行将行插入lates是错误的在students中输入。

在你的情况下,由于你没有正确normalized你的表,这很复杂。在数据库设计中,在多表格中包含相同的信息是不好的形式:因此,您不需要重复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列的外键引用。现在,如果您尝试将student_id插入到lates表中,如果students表中不存在,则会自动收到错误。

您可能想知道如何在显示学生的实际姓名时在lates表格中显示信息 - 这是通过加入来完成的:

SELECT fname,
       lname,
       time,
       reason
FROM lates
    LEFT JOIN students ON lates.student_id=student.id;

顺便说一句,我假设您知道web databases are deprecated因此将它们用于任何真实项目可能不是一个好主意。