场景:
我有一个引用两个外键的表,并且对于这些外键的每个唯一组合,都有自己的auto_increment列.我需要实现一个复合键,它将使用这三个组合(一个外键和一个auto_increment列,另一个列具有非唯一值)帮助将行标识为唯一
表:
CREATE TABLE `issue_log` (
`sr_no` INT NOT NULL AUTO_INCREMENT ,
`app_id` INT NOT NULL ,
`test_id` INT NOT NULL ,
`issue_name` VARCHAR(255) NOT NULL ,
primary key (app_id, test_id,sr_no)
);
Run Code Online (Sandbox Code Playgroud)
当然,我的查询必定有问题,因为抛出的错误是:
错误1075:表定义不正确; 只能有一个自动列,必须将其定义为键
我想要实现的目标:
我有一个Application Table(以app_id作为主键),每个Application都有一组要解决的问题,每个Application都有多个测试(所以test_id col)sr_no col应该为唯一的app_id和test_id递增.
即表中的数据应如下所示:

数据库引擎是InnoDB.我希望尽可能简单地实现这一点(即如果可能的话,避免使用触发器/程序 - 这是针对其他问题的类似情况而建议的).
我有一个感兴趣的问题:
我有2代表的mysql用InnoDb.
table tbl_a有一个主键,命名为a_id;
table上tbl_b有一个主b_id键和一个外键,tbl_a.a_id带有" ON DELETE NO ACTION".
+-------------+---------------+---------------+
| Table Name | Primary Key | Foreign Key |
+-------------+---------------+---------------+
| tbl_a | a_id | |
| tbl_b | b_id | a_id |
+-------------+---------------+---------------+
Run Code Online (Sandbox Code Playgroud)
为什么我仍然会使用InnoDb和外键,如果我最终没有真正使用外键的魔力呢?
还有一点是使用
innodb和外键
而不是
myisam而没有外键.
如果我只是NO ACTION删除或更新?
我希望你有我的兴趣:)
假设已从备份磁带还原以下MySQL文件:
tablename.frmtablename.ibd此外,假设MySQL安装正在运行,innodb_file_per_table并且数据库已完全关闭mysqladmin shutdown.
鉴于从恢复的MySQL文件中取出的相同MySQL版本的全新安装,如何将数据from tablename.ibd/ tablename.frm导入到这个新安装中?
我从dev.mysql上读过这篇文章.
在该页面中是一个例子,当使用select for update并且不要在共享模式中使用lock并且说
在这里,LOCK IN SHARE MODE不是一个好的解决方案,因为如果两个用户同时读取计数器,当它试图更新计数器时,至少有一个用户会死锁
但是本页的第一行说
SELECT ... LOCK IN SHARE MODE:读取的行是最新的,**因此,如果它们属于另一个 尚未提交的事务**,则读取将阻塞,直到该事务结束.
有悖论吗?
我的意思是两个用户不同时读取计数器,因为如果它们属于读取阻止的另一个事务,直到该事务结束.
我正在使用laravel和laravel迁移机制.我创建了表并设置了外键.但表是MyISSAM,因此不会创建外键.我在哪里启用/配置它?(将其更改为InnoDB而不是mysql服务器).
我在MySQL中创建了一个表:
CREATE TABLE actions ( A_id int NOT NULL AUTO_INCREMENT,
type ENUM('rate','report','submit','edit','delete') NOT NULL,
Q_id int NOT NULL,
U_id int NOT NULL,
date DATE NOT NULL,
time TIME NOT NULL,
rate tinyint(1),
PRIMARY KEY (A_id),
CONSTRAINT fk_Question FOREIGN KEY (Q_id) REFERENCES questions(P_id),
CONSTRAINT fk_User FOREIGN KEY (U_id) REFERENCES users(P_id));
Run Code Online (Sandbox Code Playgroud)
这创建了我想要的表(虽然"DESCRIBE actions;"命令向我显示外键是MUL类型的键,我不确定这意味着什么).但是,当我尝试输入问题或用户表中不存在的Q_id或U_id时,MySQL仍然允许这些值.
我做错了什么?如何防止带有外键的表接受无效数据?
如果我添加TYPE=InnoDB到最后,我收到一个错误:
ERROR 1005(HY000):无法创建表'./quotes/actions.frm'(错误号:150)
为什么会这样?
我被告知使用功能外键强制数据完整性很重要,但InnoDB也不应该与MySQL一起使用.您有什么推荐的吗?
有人告诉我InnoDB比MyISAM好多了.所以当我创建一个表时,我是否应该总是尝试使用InnoDB Engine而不是MyISAM?或者两者都有它的巨大好处?
我正在尝试自己的第一个大型数据库项目.我在服务器1上有一个myisam mysql数据库,其中一个php应用程序消耗了大量的各种数据.我在服务器2上有mysql myisam,php应用程序选择并显示数据.
我想在服务器2上复制这些数据.
问题:
两个锁定读取子句之间的确切区别是什么:
SELECT ... FOR UPDATE
Run Code Online (Sandbox Code Playgroud)
和
SELECT ... LOCK IN SHARE MODE
Run Code Online (Sandbox Code Playgroud)
为什么你需要使用一个而不是另一个?
我用MySQL Workbench创建了一个模型,现在正尝试将它安装到mysql服务器上.
使用文件>导出>转发工程师SQL CREATE脚本...它为我输出一个很好的大文件,我要求的所有设置.我切换到MySQL GUI Tools(专门用于查询浏览器)并加载这个脚本(请注意,我将从另一个官方MySQL工具开始).但是,当我尝试实际执行此文件时,我反复得到相同的错误
SQLSTATE [HY000]:常规错误:1005无法创建表'./srs_dev/location.frm'(错误号:150)
"好的",我对自己说,位置表有问题.所以我查看输出文件中的定义.
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
-- -----------------------------------------------------
-- Table `state`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `state` ;
CREATE TABLE IF NOT EXISTS `state` (
`state_id` INT NOT NULL AUTO_INCREMENT ,
`iso_3166_2_code` VARCHAR(2) NOT NULL ,
`name` VARCHAR(60) NOT NULL ,
PRIMARY KEY (`state_id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `brand`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `brand` ; …Run Code Online (Sandbox Code Playgroud) innodb ×10
mysql ×10
foreign-keys ×3
myisam ×3
locking ×2
php ×2
acid ×1
laravel ×1
replication ×1
transactions ×1