我正在使用MySQL Workbench设计我的数据库模式,这非常酷,因为你可以做图表并转换它们:P
无论如何,我决定使用InnoDB因为它的外键支持.我注意到的一件事是,它允许您为外键设置On Update和Delete选项.有人可以解释在一个简单的例子中可以使用"限制","级联"和设置null的位置吗?
例如,假设我有一个user包含a 的表userID.并说我有一个message多对多的消息表,它有2个外键(userID在user表中引用相同的主键).在这种情况下,设置On Update和On Delete选项是否有用?如果是这样,我选择哪一个?如果这不是一个好例子,你能否提出一个很好的例子来说明这些如何有用?
谢谢
我有一个表,其主键在其他几个表中使用,并有几个外键到其他表.
CREATE TABLE location (
locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
...
) ENGINE = InnoDB;
CREATE TABLE assignment (
assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
locationID INT NOT NULL,
FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
...
) ENGINE = InnoDB;
CREATE TABLE assignmentStuff (
...
assignmentID INT NOT NULL,
FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;
Run Code Online (Sandbox Code Playgroud)
问题是,当我试图删除其中一个外键列(即locationIDX)时,它会给我一个错误.
"ERROR 1025(HY000):重命名时出错"
如何在不发生此错误的情况下删除上面的分配表中的列?
我正在尝试在Laravel中创建外键但是当我使用artisani 迁移我的表时抛出以下错误:
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL
: alter table `priorities` add constraint priorities_user_id_foreign foreign
key (`user_id`) references `users` (`id`))
Run Code Online (Sandbox Code Playgroud)
我的迁移代码如下:
优先级迁移文件
public function up()
{
//
Schema::create('priorities', function($table) {
$table->increments('id', true);
$table->integer('user_id');
$table->foreign('user_id')->references('id')->on('users');
$table->string('priority_name');
$table->smallInteger('rank');
$table->text('class');
$table->timestamps('timecreated');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
Schema::drop('priorities');
}
Run Code Online (Sandbox Code Playgroud)
用户迁移文件
public function up()
{
//
Schema::table('users', function($table)
{
$table->create();
$table->increments('id');
$table->string('email');
$table->string('first_name');
$table->string('password');
$table->string('email_code'); …Run Code Online (Sandbox Code Playgroud) 如何在特定列上找到所有外键依赖项?
有哪些不同的替代方案(图形化在SSMS中,SQL Server中的查询/视图,第三方数据库工具,.NET中的代码)?
我正在尝试保存员工详细信息,其中包含对City的引用.但每当我尝试保存我的联系人时,我都会得到例外"ADO.Net实体框架实例对象不能被IEntityChangeTracker的多个实例引用"
我读了这么多帖子,但仍然没有弄清楚该怎么做...我的保存按钮点击代码如下
protected void Button1_Click(object sender, EventArgs e)
{
EmployeeService es = new EmployeeService();
CityService cs = new CityService();
DateTime dt = new DateTime(2008, 12, 12);
Payroll.Entities.Employee e1 = new Payroll.Entities.Employee();
Payroll.Entities.City city1 = cs.SelectCity(Convert.ToInt64(cmbCity.SelectedItem.Value));
e1.Name = "Archana";
e1.Title = "aaaa";
e1.BirthDate = dt;
e1.Gender = "F";
e1.HireDate = dt;
e1.MaritalStatus = "M";
e1.City = city1;
es.AddEmpoyee(e1,city1);
}
Run Code Online (Sandbox Code Playgroud)
和Employeeservice代码
public string AddEmpoyee(Payroll.Entities.Employee e1, Payroll.Entities.City c1)
{
Payroll_DAO1 payrollDAO = new Payroll_DAO1();
payrollDAO.AddToEmployee(e1); //Here I am getting Error..
payrollDAO.SaveChanges(); …Run Code Online (Sandbox Code Playgroud) 我想使用外键来保持完整性并避免孤儿(我已经使用了innoDB).
如何创建DELETE ON CASCADE的SQL语句?
如果我删除某个类别,那么如何确保它不会删除与其他类别相关的产品.
数据透视表"categories_products"在其他两个表之间创建了多对多关系.
categories
- id (INT)
- name (VARCHAR 255)
products
- id
- name
- price
categories_products
- categories_id
- products_id
Run Code Online (Sandbox Code Playgroud) 假设我有2个表,Products和ProductCategories.两个表都与CategoryId有关系.这是查询.
SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category
FROM Products p
INNER JOIN ProductCategories c ON p.CategoryId = c.CategoryId
WHERE c.CategoryId = 1;
Run Code Online (Sandbox Code Playgroud)
当我创建执行计划时,表ProductCategories执行集群索引查找,这是期望的.但对于表产品,它执行集群索引扫描,这让我怀疑.为什么FK无助于提高查询性能?
所以我必须在Products.CategoryId上创建索引.当我再次创建执行计划时,两个表都执行索引查找.估计的子树成本降低了很多.
我的问题是:
除了FK有助于关系约束,它还有其他用处吗?它是否提高了查询性能?
我应该在所有表中的所有FK列(如Products.CategoryId)上创建索引吗?
在SQL Server中设置外键时,在什么情况下应该在删除或更新时级联它,背后的原因是什么?
这可能也适用于其他数据库.
我最关注每个场景的具体例子,最好是那些成功使用它们的人.
如果我想像这样删除我的数据库中的所有表,它会处理外键约束吗?如果没有,我该如何处理?
GO
IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL
DROP TABLE dbo.[Course]
GO
IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL
DROP TABLE dbo.[Student]
Run Code Online (Sandbox Code Playgroud) sql-server constraints foreign-keys drop-table database-table
我刚刚开始使用外键第一次使用外键,我想知道是否有一个标准的命名方案可用于它们?
鉴于这些表格:
task (id, userid, title)
note (id, taskid, userid, note);
user (id, name)
Run Code Online (Sandbox Code Playgroud)
任务具有Notes,任务由用户拥有,用户拥有Notes.
在这种情况下如何命名三个外键?或者,它甚至是否重要?
更新:这个问题是关于外键名称,而不是字段名称!
foreign-keys ×10
sql-server ×4
mysql ×3
constraints ×2
database ×2
sql ×2
.net ×1
ado.net ×1
asp.net ×1
c# ×1
cascade ×1
drop-table ×1
eloquent ×1
indexing ×1
innodb ×1
laravel ×1
laravel-4 ×1
migration ×1
performance ×1
rdbms ×1