使用Webmatrix、Bootstrap、SQL实现两表插入时外键ID保持一致的求助
问题根因
- 两张表的插入操作没有做外键关联,你插入
Storage表时没有给外键字段carID赋值,两条记录完全独立,FULL OUTER JOIN时自然会返回两条字段分别为空的不关联记录 - 插入操作用错了方法:
QueryValue是用来获取查询结果的单个返回值的,执行INSERT/UPDATE/DELETE这类非查询SQL需要用Execute方法 - 现有代码存在语法错误,第一个插入语句的调用括号、结尾符号都不完整
GetLastInsertID()的调用时机不对,必须在执行INSERT语句之后立刻调用,才能拿到刚插入记录的自增主键ID
修正后的代码
@{ var db = Database.Open("DB Name"); if (IsPost) { // 先插入车辆表,获取刚生成的自增carID var inCarSql = "INSERT INTO Cars (carName, modelName) VALUES (@0, @1)"; db.Execute(inCarSql, Request.Form["carName"], Request.Form["modelName"]); // 立刻获取刚插入的车辆自增ID var carId = db.GetLastInsertId(); // 再插入仓储表,绑定刚才拿到的carID建立关联 var inSql = "INSERT INTO Storage (carID, location, GPS) VALUES (@0, @1, @2)"; db.Execute(inSql, carId, Request.Form["location"], Request.Form["gps"]); } }
额外注意点
- 你写的关联查询SQL存在笔误,JOIN条件里的表名写错了,正确语句为:
SELECT * From Storage FULL OUTER JOIN Cars ON Storage.carID = Cars.carID - 建议新增事务包裹两个插入操作,避免其中一个插入失败产生脏数据
- 入库前建议对表单参数做非空、合法性校验,避免非法数据写入数据库
内容的提问来源于stack exchange,提问作者Nois3y
相关产品推荐
相关产品推荐

