我有一个表,它有两个属性:创建该记录的 ID 和日期时间。
我怎样才能触发(程序?)在一天后删除记录?
我想要一个每 X 次执行一次的任务,而不必手动执行。
我在 Postgres 中使用 CTE 编写了以下查询。现在我无法从中删除记录。
WITH cte AS (
SELECT
firstname,
lastname,
country,
ROW_NUMBER() OVER (
PARTITION BY
firstname,
lastname,
country
) row_num
FROM
employee
)
delete from cte
where row_num >1
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时,它显示错误:
关系“cte”不存在
这是我的表“员工”的示例
id firstname lastname country
1 "Raj" "Gupta" "India"
2 "Raj" "Gupta" "India"
3 "Mohan" "Kumar" "USA"
4 "James" "Barry" "UK"
5 "James" "Barry" "UK"
6 "James" "Barry" "UK"
Run Code Online (Sandbox Code Playgroud) 我想从数据库中删除某些项目.我有以下查询:
SELECT *
FROM sheets, entries
WHERE entries.sheetID = sheets.id AND sheets.clientID = 13
Run Code Online (Sandbox Code Playgroud)
这有效,并返回2个结果.
现在我想将此SELECT查询转换为DELETE查询.但是,以下不起作用:
DELETE FROM sheets, entries
WHERE entries.sheetID = sheets.id AND sheets.clientID = 13
Run Code Online (Sandbox Code Playgroud)
MySQL抛出以下错误:
1064 - 您的SQL语法出错; 检查与MySQL服务器版本对应的手册,以便在第1行的"WHERE entries.sheetID = sheets.id AND sheets.clientID = 13"附近使用正确的语法
我在这做错了什么?
好吧,这可能是一个非常简单的问题,但我恐怕几乎不知道MySQL,所以请忍受我.我只是试图从一个表中删除不受另一个表中的外键约束的每一行 - 一个特定的表,这里只涉及两个表.create语句看起来有点像:
CREATE TABLE `testschema`.`job` (
`Job_Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Comment` varchar(255) DEFAULT NULL,
PRIMARY KEY (`Job_Id`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `ermieimporttest`.`jobassignment` (
`JobAssignment_Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`JobId` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`JobAssignment_Id`),
KEY `FK_jobassignment_1` (`JobId`),
CONSTRAINT `FK_jobassignment_1` FOREIGN KEY (`JobId`) REFERENCES `job` (`Job_Id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
我的任何SQL语句都是:
DELETE FROM job USING job INNER JOIN jobAssignment WHERE job.Job_Id != jobAssignment.JobId;
Run Code Online (Sandbox Code Playgroud)
我认为这是正确的 - 它应该删除作业表中的每个作业,而作业作业中没有作业,因为它是外键.但是,当我尝试执行它时失败并出现以下错误:
无法删除或更新父行:外键约束失败( …
错误1093表示如果子查询查询要删除的表,则无法使用子查询更新或删除.
所以你做不到
delete from table1 where id in (select something from table1 where condition) ;
Run Code Online (Sandbox Code Playgroud)
好吧,解决这个限制的最佳方法是什么(假设您确实需要子查询来执行删除,并且不能完全消除自引用子查询?)
编辑:
以下是对有兴趣的人的查询:
mysql> desc adjacencies ; +---------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+---------+------+-----+---------+-------+ | parent | int(11) | NO | PRI | NULL | | | child | int(11) | NO | PRI | NULL | | | pathLen | int(11) | NO | | NULL | | +---------+---------+------+-----+---------+-------+ -- The query is going to -- …
我有一个设置,我从表中删除条目.
它基于URL的查询字符串,我认为这可能是一个不好的开始方式.
因此,如果URL是:
http://www.example.com/delete.php?id=123&ref=abc
而delete.php中的php如下:
$id=$_GET['id'];
$ref=$_GET['ref'];
$con = mysql_connect("blahblah","user","password");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("test", $con);
mysql_query("DELETE FROM mytable WHERE id=" . $id . " AND ref='" . $ref . "'");
mysql_close($con);
Run Code Online (Sandbox Code Playgroud)
有没有办法让这更安全......或者这确实在任何方面都是安全的吗?
编辑:
好的,基于反馈,我采取了一种新的方法.
list.php包含表中每个条目的一组radiobuttons - 如下所示:
$con = mysql_connect("localhost","username","password");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("db", $con);
$result = mysql_query("SELECT * FROM myTable");
echo "<form name='wer' id='wer' action='delete.php' method='post' >";
echo "<table border='1'>";
while($row = mysql_fetch_array($result))
{
echo …Run Code Online (Sandbox Code Playgroud) 我有以下查询,适用于MySQL:
DELETE `test1`, `test2`, `test3`, `test4` FROM
`test1` LEFT JOIN `test2` ON test2.qid = test1.id
LEFT JOIN test3 ON test3.tid = test2.id
LEFT JOIN test4.qid = test1.id
WHERE test1.id = {0}
Run Code Online (Sandbox Code Playgroud)
但它不适用于MS Access.我试图在LEFT JOIN它周围添加括号,但它在FROM子句中给出了语法错误.那么这个查询应该怎样才能在MS Access中工作?
我正在使用Firebird 2.5.1 Embedded。我已经按照通常的方法清空了近200k行的表:
delete from SZAFKI
Run Code Online (Sandbox Code Playgroud)
这是输出,需要16秒,这是不可接受的。
Preparing query: delete from SZAFKI
Prepare time: 0.010s
PLAN (SZAFKI NATURAL)
Executing...
Done.
3973416 fetches, 1030917 marks, 116515 reads, 116434 writes.
0 inserts, 0 updates, 182658 deletes, 27 index, 182658 seq.
Delta memory: -19688 bytes.
SZAFKI: 182658 deletes.
182658 rows affected directly.
Total execution time: 16.729s
Script execution finished.
Run Code Online (Sandbox Code Playgroud)
Firebird没有TRUNCATE关键字。当查询使用PLAN NATURAL时,我尝试手动进行查询计划,如下所示:
delete from szafki PLAN (SZAFKI INDEX (SZAFKI_PK))
Run Code Online (Sandbox Code Playgroud)
但是Firebird说“ SZAFKI_PK无法在指定计划中使用”(这是主键)问题是如何有效清空表?无法删除和重新创建。
我已经阅读了很多关于级联和多对多关联的主题,但我无法找到我的特定问题的答案.
我在UserProfiles和Roles之间有多对多的关系.当我删除UserProfile时,我希望数据库删除连接表(userprofile2role)中的关联记录,因此使用实际的SQL"ON DELETE CASCADE"操作.这可能吗?无论我尝试什么,Hibernate总是创建UserProfile表而不指定ON DELETE行为.
UserProfile映射:
@Entity
public class UserProfile {
private Long id;
private Set<Role> roles;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public final Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
// Note: CascadeType.ALL doesn't work for many-to-many relationships
@ManyToMany (fetch = FetchType.EAGER)
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
}
Run Code Online (Sandbox Code Playgroud)
角色映射:
@Entity
public class Role {
private Long id;
private Set<UserProfile> userProfiles = …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring框架来开展培训项目.我也在使用JPA,并且一直有一段时间.在我的DAO实现课中,我写道:
@Override
public void deleteEntries(Module mod) {
System.out.println(mod.getDescription());
entityManager.createQuery("delete from TrainingEntry e where e.module = :mod and e.completedDate IS NULL",
TrainingEntry.class).setParameter("mod", mod);
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它只是一个简单的DELETE语句,但我收到错误:
"Update/delete queries cannot be typed."
Run Code Online (Sandbox Code Playgroud)
我的猜测是,我需要使用一些EntityManager类方法来完成这项工作,但我不确定,因为在线这个错误几乎没有.我也很难应用我在网上找到的有关JPA删除查询的一些解决方案.任何关于正确方向的点或解释为什么抛出这个错误都非常感激.
sql-delete ×10
sql ×6
mysql ×4
cascade ×1
firebird ×1
foreign-keys ×1
hibernate ×1
java ×1
jet ×1
jpa ×1
jpa-2.0 ×1
many-to-many ×1
ms-access ×1
php ×1
postgresql ×1
security ×1
select ×1
spring ×1
sql-server ×1
sql-update ×1
truncate ×1